Rumah >tajuk utama >Sepuluh ciri baharu teratas PHP8.1, gunakannya dengan pantas!
Jenis pulangannever
Atributreadonly
Pemalar kelasfinal
Fungsiarray_is_list()
dan fsync()
fdatasync()
Baharu $_FILES
untuk muat naik direktori full_path
kelas IntlDatePatternGenerator
. Ia adalah jenis terperinci yang mengandungi bilangan nilai yang mungkin tetap. Lihat coretan kod berikut untuk mengetahui cara menggunakan penghitungan. enum
<?php /** * Declare an enumeration. * It can also contain an optional 'string' or 'int' value. This is called backed Enum. * Backed enums (if used) should match the following criteria: * - Declare the scalar type, whether string or int, in the Enum declaration. * - All cases have values. * - All cases contain the same scalar type, whether string or int. * - Each case has a unique value. */ enum UserRole: string { case ADMIN = '1'; case GUEST = '2'; case WRITER = '3'; case EDITOR = '4'; } /** * You can access a case by using * the '::' scope resolution operator. * And, to get the name of the enum case, you * can use the '->' followed by the attribute 'name'. */ echo UserRole::WRITER->name; /** * To get the value of the enum case, you can * use the '->' followed by the attribute 'value'. */ echo UserRole::WRITER->value; ?>2. Fiber PHP 8.1 menambah sokongan untuk
, komponen peringkat rendah yang membenarkan pelaksanaan kod serentak dalam PHP. Fiber ialah blok kod yang mengandungi pembolehubah sendiri dan susunan keadaan. Gentian ini boleh dianggap sebagai utas aplikasi dan boleh dimulakan dari program utama. Setelah dimulakan, program utama tidak boleh menggantung atau menamatkan Fiber. Ia hanya boleh dijeda atau ditamatkan dari dalam blok kod Fiber. Selepas Fiber digantung, kawalan dikembalikan semula ke program utama, dan ia boleh terus melaksanakan Fiber dari titik penggantungan. Fiber
Fiber itu sendiri tidak membenarkan berbilang Fiber atau benang utama dan Fiber dilaksanakan pada masa yang sama. Walau bagaimanapun, ia adalah satu kelebihan yang besar untuk rangka kerja PHP untuk mengurus timbunan pelaksanaan dengan cekap dan membenarkan pelaksanaan tak segerak.Lihat coretan kod berikut untuk mengetahui cara menggunakan Fiber.
<?php /** * Initialize the Fiber. */ $fiber = new Fiber(function(): void { /** * Print some message from inside the Fiber. * Before the Fiber gets suspended. */ echo "Welcome to Fiber!\n"; /** * Suspend the Fiber. */ Fiber::suspend(); /** * Print some message from inside the Fiber. * After the Fiber gets resumed. */ echo "Welcome back to Fiber!\n"; }); /** * Print a message before starting a Fiber. */ echo "Starting a Fiber\n"; /** * Start the Fiber. */ $fiber->start(); /** * Fiber has been suspened from the inside. * Print some message, and then resume the Fiber. */ echo "Fiber has been suspended\n"; echo "Resuming the Fiber\n"; /** * Resume the Fiber. */ $fiber->resume(); /** * End of the example. */ echo "Fiber completed execution\n"; ?>3.
never
. Jenis never
boleh digunakan untuk menunjukkan bahawa fungsi akan menamatkan pelaksanaan program selepas melaksanakan set tugasan tertentu. Ini boleh dilakukan dengan membuang pengecualian, memanggil fungsi never
atau exit()
. Jenis pemulangan die()
Lihat coretan kod berikut untuk memahami cara menggunakan jenis tidak pernah kembali.adalah serupa dengan jenis pemulangan
never
. Walau bagaimanapun, jenis pulanganvoid
meneruskan pelaksanaan selepas fungsi menyelesaikan set tugasan yang ditentukan.void
<?php /** * Route Class */ class Route { /** * Constructor of the class * @return void */ public function __construct() { } /** * Redirect To a Page * This function redirects to an URL specified by the user. * @method redirect() * @param string $url * @param integer $httpCode * @author Tara Prasad Routray <someemailaddress@example.com> * @access public * @return never */ public static function redirect($url, $httpCode = 301): never { /** * Redirect to the URL specified. */ header("Location: {$url}", true, $httpCode); die; } } Route::redirect('https://www.google.com'); ?>4.
readonly
. Sifat kelas yang telah diisytiharkan baca sahaja hanya boleh dimulakan sekali. Nilai yang ditetapkan di dalam tidak boleh diubah. Jika anda cuba memaksa kemas kini nilai, aplikasi akan menimbulkan ralat. Lihat coretan kod berikut untuk mengetahui cara menggunakan sifat baca sahaja. readonly
<?php /** * User Class */ class User { /** * Declare a variable with readonly property. * @var $authUserID * @access public */ public readonly int $authUserID; /** * Constructor of the class. * @param integer $userID * @return void */ public function __construct($userID) { /** * Change the value of the property as specified. * Updating the value of readonly properties are * allowed only through the constructor. */ $this->authUserID = $userID; } /** * Update Auth User ID * This function tries to update the readonly property (which is not allowed). * @method updateAuthUserID() * @param integer $userID * @author Tara Prasad Routray <someemailaddress@example.com> * @access public * @return void */ public function updateAuthUserID($userID) { /** * Change the value of the property as specified. * Executing this function will throw the following error; * PHP Fatal error: Uncaught Error: Cannot modify readonly property User::$authUserID */ $this->authUserID = $userID; } } /** * Initialize the class and update the value of the readonly property. */ $user = new User(30); /** * Print the readonly property value. * This will print 30. */ echo $user->authUserID; /** * Call another function inside the class and try to update the class property. */ $user->updateAuthUserID(50); /** * Print the readonly property value. */ echo $user->authUserID; ?>5
final
. Pemalar kelas akhir tidak boleh diubah suai, walaupun melalui pewarisan, yang bermaksud ia tidak boleh dilanjutkan atau ditindih oleh subkelas. final
Bendera ini tidak boleh digunakan untuk pemalar peribadi kerana ia tidak boleh diakses di luar kelas. Mengisytiharkan pemalar akhir dan persendirian akan mengakibatkan ralat maut.Lihat coretan kod berikut untuk melihat cara menggunakan bendera akhir.
<?php /** * UserRole Class */ class UserRole { /** * Declare a final class constant with a value. */ final public const ADMIN = '1'; } /** * User Class extending the UserRole Class */ class User extends UserRole { /** * Declare another constant with the same name * as of the parent class to override the value. * * Note: Overriding the value will throw the following error: * PHP Fatal error: User::ADMIN cannot override final constant UserRole::ADMIN */ public const ADMIN = '2'; } ?>6 Fungsi
array_is_list()
. Ia mengenal pasti sama ada tatasusunan yang ditentukan mempunyai semua integer berturut-turut bermula pada 0. Fungsi ini kembali benar jika tatasusunan ialah senarai nilai semantik (susunan yang kuncinya bermula pada 0, semuanya integer, dan tidak mempunyai jurang di antaranya). Ia juga mengembalikan benar untuk tatasusunan kosong. Lihat coretan kod berikut untuk mengetahui cara menggunakan fungsi array_is_list(). array_is_list()
<?php /** * Returns true for empty array. */ array_is_list([]); /** * Returns true for sequential set of keys. */ array_is_list([1, 2, 3]); /** * Returns true as the first key is zero, and keys are in sequential order. * It is same as [0 => 'apple', 1 => 2, 2 => 3] */ array_is_list(['apple', 2, 3]); /** * Returns true as the first key is zero, and keys are in sequential order. * It is same as [0 => 'apple', 1 => 'scissor'] */ array_is_list(['apple', 'orange']); /** * Returns true as the first key is zero, and keys are in sequential order. * It is same as [0 => 'apple', 1 => 'scissor'] */ array_is_list([0 => 'apple', 'orange']); /** * Returns true as the first key is zero, and keys are in sequential order. */ array_is_list([0 => 'rock', 1 => 'scissor']); ?>Susun atur dengan kekunci bukan berasaskan 0, atau kekunci bukan integer, atau kekunci adalah integer tetapi berlaku di luar susunan akan dinilai sebagai palsu.
<?php /** * Returns false as the first key does not start from zero. */ array_is_list([1 => 'apple', 'orange']); /** * Returns false as the first key does not start from zero. */ array_is_list([1 => 'apple', 0 => 'orange']); /** * Returns false as all keys are not integer. */ array_is_list([0 => 'apple', 'fruit' => 'orange']); /** * Returns false as the keys are not in sequential order. */ array_is_list([0 => 'apple', 2 => 'orange']); ?>7. Fungsi
fsync()
baharu fdatasync()
dan fsync()
. Kedua-duanya mempunyai persamaan dengan fungsi fdatasync()
sedia ada, yang pada masa ini digunakan untuk membuang penimbal ke dalam sistem pengendalian. Walau bagaimanapun, fflush()
dan fsync()
siram penimbal ini kepada storan fizikal. Satu-satunya perbezaan antara mereka ialah fungsi fdatasync()
ini termasuk metadata apabila menyegerakkan perubahan fail, manakala fungsi fsync()
ini tidak termasuk metadata. fdatasync()
fsync()
函数将采用文件指针并尝试将更改提交到磁盘。成功时返回 true,失败时返回 false,如果资源不是文件,则会发出警告。fdatasync()
函数的工作方式相同,但速度稍快一些,因为 fsync() 将尝试完全同步文件的数据更改和有关文件的元数据(上次修改时间等),这在技术上是两次磁盘写入。
请参阅以下代码片段以了解如何使用 fsync() 和 fdatasync() 函数。
<?php /** * Declare a variable and assign a filename. */ $fileName = 'notes.txt'; /** * Create the file with read and write permission. */ $file = fopen($fileName, 'w+'); /** * Add some text into the file. */ fwrite($file, 'Paragraph 1'); /** * Add a line break into the file. */ fwrite($file, "\r\n"); /** * Add some more text into the file. */ fwrite($file, 'Paragraph 2'); /** * You can use both the fsync() or fdatasync() functions * to commit changs to disk. */ fsync($file); // or fdatasync($file). /** * Close the open file pointer. */ fclose($file); ?>
PHP 8.1 添加了对字符串键数组解包的支持。为了解压数组,PHP 使用展开(…)
运算符。PHP 7.4 中引入了这个运算符来合并两个或多个数组,但语法更简洁。但在 PHP 8.1 之前,展开运算符仅支持带数字键的数组。请参阅以下代码片段以了解如何将展开运算符用于字符串键控数组。
<?php /** * Declare an array */ $fruits1 = ['Jonathan Apples', 'Sapote']; /** * Declare another array */ $fruits2 = ['Pomelo', 'Jackfruit']; /** * Merge above two arrays using array unpacking. */ $unpackedFruits = [...$fruits1, ...$fruits2, ...['Red Delicious']]; /** * Print the above unpacked array. * This will print: * array(5) { * [0]=> * string(15) "Jonathan Apples" * [1]=> * string(6) "Sapote" * [2]=> * string(6) "Pomelo" * [3]=> * string(9) "Jackfruit" * [4]=> * string(13) "Red Delicious" * } */ var_dump($unpackedFruits); ?>
$_FILES
新的用于目录上传的 full_path
键PHP 8.1 添加了对$_FILES
全局变量中full_path
新键的支持。在 PHP 8.1 之前,$_FILES
没有存储到服务器的相对路径或确切目录。因此,您无法使用 HTML 文件上传表单上传整个目录。新full_path
键解决了这个问题。它存储相对路径并在服务器上重建确切的目录结构,使目录上传成为可能。请参阅以下代码片段以了解如何将full_path
键与$_FILES
全局变量一起使用。
<?php /** * Check if the user has submitted the form. */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { /** * Print the $_FILES global variable. This will display the following: * array(1) { * ["myfiles"]=> array(6) { * ["name"]=> array(2) { * [0]=> string(9) "image.png" * [1]=> string(9) "image.png" * } * ["full_path"]=> array(2) { * [0]=> string(25) "folder1/folder2/image.png" * [1]=> string(25) "folder3/folder4/image.png" * } * ["tmp_name"]=> array(2) { * [0]=> string(14) "/tmp/phpV1J3EM" * [1]=> string(14) "/tmp/phpzBmAkT" * } * // ... + error, type, size * } * } */ var_dump($_FILES); } ?> <form action="" method="POST" enctype="multipart/form-data"> <input name="myfiles[]" type="file" webkitdirectory multiple /> <button type="submit">Submit</button> </form>
IntlDatePatternGenerator
类PHP 8.1 添加了对新IntlDatePatternGenerator
类的支持。在 PHP 8.1 之前,只能使用IntlDateFormatter
。虽然它支持昨天、今天和明天使用的八种预定义格式,但是这些格式和IntlDatePatternGenerator
不太一样。这个类允许指定日期、月份和时间的格式,并且顺序将由类自动处理。请参阅以下代码片段以了解如何使用 IntlDatePatternGenerator 类。
<?php /** * Define a default date format. */ $skeleton = "YYYY-MM-dd"; /** * Parse a time string (for today) according to a specified format. */ $today = \DateTimeImmutable::createFromFormat('Y-m-d', date('Y-m-d')); /** * =========================== * PRINTING DATE IN USA FORMAT * =========================== * Initiate an instance for the IntlDatePatternGenerator class * and provide the locale information. * In the below example, I've used locale: en_US. */ $intlDatePatternGenerator = new \IntlDatePatternGenerator("en_US"); /** * Get the correct date format for the locale: en_US. * Following function "getBestPattern" will return: * MM/dd/YYYY */ $enUSDatePattern = $intlDatePatternGenerator->getBestPattern($skeleton); /** * Use the "formatObject" function of IntlDateFormatter to print as per specified pattern. * This will print the following: * Date in en-US: 12/03/2021 */ echo "Date in en-US: ". \IntlDateFormatter::formatObject($today, $enUSDatePattern, "en_US"). "\n"; /** * ============================= * PRINTING DATE IN INDIA FORMAT * ============================= * Initiate an instance for the IntlDatePatternGenerator class * and provide the locale information. * In the below example, I've used locale: en_IN. */ $intlDatePatternGenerator = new \IntlDatePatternGenerator("en_IN"); /** * Get the correct date format for the locale: en_IN. * Following function "getBestPattern" will return: * dd/MM/YYYY */ $enINDatePattern = $intlDatePatternGenerator->getBestPattern($skeleton); /** * Use the "formatObject" function of IntlDateFormatter to print as per specified pattern. * This will print the following: * Date in en-IN: 03/12/2021 */ echo "Date in en-IN: ". \IntlDateFormatter::formatObject($today, $enINDatePattern, "en_IN"). "\n"; ?>
点赞!您已经完成了 PHP 8.1 提供的功能的学习。现在您可以继续并开始在您当前或即将进行的项目中实现上述功能。
原文:https://levelup.gitconnected.com/top-10-php-8-1-features-you-should-start-using-now-7161b91275fd