PHP 8.4 đánh dấu một bản cập nhật quan trọng cho ngôn ngữ PHP. Nó giới thiệu nhiều tính năng mới, chẳng hạn như hooks thuộc tính, khả năng hiển thị bất đối xứng, API DOM được cập nhật, cải tiến hiệu suất, sửa lỗi và dọn dẹp tổng thể.
Chuẩn bị
Đầu tiên, thiết lập môi trường phát triển PHP. Mở ServBay, chọn gói PHP 8.4, và chỉ sau khoảng 3 phút, môi trường phát triển PHP 8.4 của bạn sẽ sẵn sàng.
Tiếp theo, hãy cùng xem những cập nhật trong PHP 8.4 so với các phiên bản trước.
Hooks thuộc tính
Hooks thuộc tính cung cấp hỗ trợ cho các thuộc tính được tính toán mà có thể được IDE và công cụ phân tích tĩnh hiểu trực tiếp, loại bỏ nhu cầu viết các bình luận docblock có thể không hợp lệ. Chúng cũng cho phép xử lý trước hoặc xử lý sau các giá trị một cách đáng tin cậy mà không cần kiểm tra sự phù hợp giữa các getter hoặc setter trong lớp.
Không phải PHP 8.4
class Locale
{ private string $languageCode; private string $countryCode; public function __construct(string $languageCode, string $countryCode) { $this->setLanguageCode($languageCode); $this->setCountryCode($countryCode); } public function getLanguageCode(): string { return $this->languageCode; } public function setLanguageCode(string $languageCode): void { $this->languageCode = $languageCode; } public function getCountryCode(): string { return $this->countryCode; } public function setCountryCode(string $countryCode): void { $this->countryCode = strtoupper($countryCode); } public function setCombinedCode(string $combinedCode): void { [$languageCode, $countryCode] = explode('_', $combinedCode, 2); $this->setLanguageCode($languageCode); $this->setCountryCode($countryCode); } public function getCombinedCode(): string { return \sprintf("%s_%s", $this->languageCode, $this->countryCode); }
} $brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->getCountryCode()); // BR
var_dump($brazilianPortuguese->getCombinedCode()); // pt_BR
PHP 8.4
class Locale
{ public string $languageCode; public string $countryCode { set (string $countryCode) { $this->countryCode = strtoupper($countryCode); } } public string $combinedCode { get => \sprintf("%s_%s", $this->languageCode, $this->countryCode); set (string $value) { [$this->countryCode, $this->languageCode] = explode('_', $value, 2); } } public function __construct(string $languageCode, string $countryCode) { $this->languageCode = $languageCode; $this->countryCode = $countryCode; }
} $brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->countryCode); // BR
var_dump($brazilianPortuguese->combinedCode); // pt_BR
Khả năng Hiển thị Bất Đối Xứng
Bạn bây giờ có thể kiểm soát độc lập phạm vi ghi và đọc của các thuộc tính, giảm thiểu nhu cầu viết các phương thức getter rườm rà để lộ giá trị thuộc tính trong khi ngăn chặn các sửa đổi từ bên ngoài lớp.
Không phải PHP 8.4
class PhpVersion
{ public string $version = '8.3';
} $phpVersion = new PhpVersion();
var_dump($phpVersion->version); // string(3) "8.3"
$phpVersion->version = 'PHP 8.4'; // Không có lỗi
PHP 8.4
class PhpVersion
{ public private(set) string $version = '8.4';
} $phpVersion = new PhpVersion();
var_dump($phpVersion->version); // string(3) "8.4"
$phpVersion->version = 'PHP 8.3'; // Lỗi hiển thị
Thuộc tính #[\Deprecated]
Thuộc tính mới #[\Deprecated] cho phép cơ chế gỡ bỏ hiện có của PHP được áp dụng cho các hàm do người dùng định nghĩa, phương thức và hằng số lớp.
Không phải PHP 8.4
class PhpVersion
{ /** * @deprecated 8.3 use PhpVersion::getVersion() instead */ public function getPhpVersion(): string { return $this->getVersion(); } public function getVersion(): string { return '8.3'; }
} $phpVersion = new PhpVersion();
// Không có chỉ dẫn rằng phương thức đã bị gỡ bỏ.
echo $phpVersion->getPhpVersion();
PHP 8.4
class PhpVersion
{ #[\Deprecated( message: "use PhpVersion::getVersion() instead", since: "8.4", )] public function getPhpVersion(): string { return $this->getVersion(); } public function getVersion(): string { return '8.4'; }
} $phpVersion = new PhpVersion();
// Deprecated: Phương thức PhpVersion::getPhpVersion() đã bị gỡ bỏ kể từ 8.4, hãy sử dụng PhpVersion::getVersion() thay thế
echo $phpVersion->getPhpVersion();
Tính năng mới của ext-dom và hỗ trợ HTML5
API DOM mới bao gồm hỗ trợ tuân thủ tiêu chuẩn cho việc phân tích tài liệu HTML5, sửa một số lỗi chuẩn lâu dài trong chức năng DOM, và thêm một số hàm để hỗ trợ xử lý tài liệu. API DOM mới có thể được sử dụng trong không gian tên Dom. Bạn có thể tạo tài liệu bằng các lớp Dom\HTMLDocument và Dom\XMLDocument.
Không phải PHP 8.4
$dom = new DOMDocument();
$dom->loadHTML( <<<'HTML' <main> <article>PHP 8.4 là một bản phát hành đầy đủ tính năng!</article> <article class="featured">PHP 8.4 thêm các lớp DOM mới tuân thủ tiêu chuẩn, giữ lại các lớp cũ để tương thích.</article> </main> HTML, LIBXML_NOERROR,
); $xpath = new DOMXPath($dom);
$node = $xpath->query(".//main/article[not(following-sibling::*)]")[0];
$classes = explode(" ", $node->className); // Đơn giản hóa
var_dump(in_array("featured", $classes)); // bool(true)
PHP 8.4
$dom = Dom\HTMLDocument::createFromString( <<<HTML <main> <article>PHP 8.4 là một bản phát hành đầy đủ tính năng!</article> <article class="featured">PHP 8.4 thêm các lớp DOM mới tuân thủ tiêu chuẩn, giữ lại các lớp cũ để tương thích.</article> </main> HTML, LIBXML_NOERROR,
); $node = $dom->querySelector('main > article:last-child');
var_dump($node->classList->contains("featured")); // bool(true)
Các hàm mới array_*()
Các hàm mới array_find(), array_find_key(), array_any(), và array_all() đã được thêm vào.
Không phải PHP 8.4
$animal = null;
foreach (['dog', 'cat', 'cow', 'duck', 'goose'] as $value) { if (str_starts_with($value, 'c')) { $animal = $value; break; }
} var_dump($animal); // string(3) "cat"
PHP 8.4
$animal = array_find( ['dog', 'cat', 'cow', 'duck', 'goose'], static fn(string $value): bool => str_starts_with($value, 'c'),
); var_dump($animal); // string(3) "cat"
Bộ phân tích SQL riêng cho từng Driver cho PDO
Các lớp con mới như Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc, và Pdo\Sqlite hiện đã có sẵn.
Không phải PHP 8.4
$connection = new PDO( 'sqlite:foo.db', $```php
$username, $password,
); // object(PDO) $connection->sqliteCreateFunction( 'prepend_php', static fn ($string) => "PHP {$string}",
); $connection->query('SELECT prepend_php(version) FROM php');
PHP 8.4
$connection = PDO::connect( 'sqlite:foo.db', $username, $password,
); // object(Pdo\Sqlite) $connection->createFunction( 'prepend_php', static fn ($string) => "PHP {$string}",
); // Không tồn tại trên driver không khớp. $connection->query('SELECT prepend_php(version) FROM php');
Truy cập các phương thức mà không cần dấu ngoặc
Bạn bây giờ có thể truy cập các thuộc tính và phương thức của các đối tượng mới khởi tạo mà không cần bọc biểu thức mới trong dấu ngoặc.
Không phải PHP 8.4
class PhpVersion
{ public function getVersion(): string { return 'PHP 8.3'; }
} var_dump((new PhpVersion())->getVersion());
PHP 8.4
class PhpVersion
{ public function getVersion(): string { return 'PHP 8.4'; }
} var_dump(new PhpVersion()->getVersion());
Các lớp, giao diện và hàm mới
- Một triển khai JIT mới dựa trên framework IR.
- Thêm hàm request_parse_body().
- Các hàm mới: bcceil(), bcdivmod(), bcfloor(), và bcround().
- Giới thiệu enum RoundingMode cho round(), bao gồm bốn chế độ làm tròn mới: TowardsZero, AwayFromZero, NegativeInfinity, và PositiveInfinity.
- Các phương thức mới cho DateTime và DateTimeImmutable: createFromTimestamp(), getMicrosecond(), setMicrosecond().
- Thêm mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), và mb_lcfirst().
- Các hàm mới: pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns(), và pcntl_waitid().
- Các phương thức mới: ReflectionClassConstant::isDeprecated(), ReflectionGenerator::isClosed(), và ReflectionProperty::isDynamic().
- Các hàm mới: http_get_last_response_headers(), http_clear_last_response_headers(), và fpow().
- Các phương thức mới cho xử lý XML: XMLReader::fromStream(), XMLReader::fromUri(), XMLReader::fromString(), XMLWriter::toStream(), XMLWriter::toUri(), và XMLWriter::toMemory().
- Hàm mới: grapheme_str_split().
Các tính năng bị gỡ bỏ và không tương thích ngược
- Các phần mở rộng IMAP, OCI8, PDO_OCI, và pspell đã bị loại bỏ khỏi PHP và chuyển sang PECL.
- Các loại tham số nullable ngầm định hiện đã bị gỡ bỏ.
- Sử dụng _ làm tên lớp là không được khuyến khích.
- Các lũy thừa âm của số không đã bị gỡ bỏ.
- Việc truyền các chế độ không hợp lệ cho round() sẽ ném ra ValueError.
- Các hằng số lớp từ các phần mở rộng date, intl, pdo, reflection, spl, sqlite, và xmlreader hiện đã được định kiểu mạnh.
- Lớp GMP hiện đã là final.
- Các hằng số bị loại bỏ: MYSQLI_SET_CHARSET_DIR, MYSQLI_STMT_ATTR_PREFETCH_ROWS, MYSQLI_CURSOR_TYPE_FOR_UPDATE, MYSQLI_CURSOR_TYPE_SCROLLABLE, và MYSQLI_TYPE_INTERVAL.
- Các hàm mysqli_ping(), mysqli_kill(), mysqli_refresh(), và các phương thức tương ứng mysqli::ping(), mysqli::kill(), mysqli::refresh(), cùng với các hằng số MYSQLI_REFRESH_* đã bị gỡ bỏ.
- stream_bucket_make_writeable() và stream_bucket_new() hiện trả về các thể hiện StreamBucket thay vì stdClass.
- Thay đổi hành vi của exit().
- Hằng số E_STRICT đã bị gỡ bỏ.
Kết luận
PHP 8.4 mang đến một loạt các tính năng mới và cải tiến giúp nâng cao khả năng sử dụng và hiệu suất của ngôn ngữ. Các nhà phát triển giờ đây có thể tận dụng hooks thuộc tính, khả năng hiển thị bất đối xứng, và một API DOM mạnh mẽ hơn, cùng với nhiều cải tiến khác. Tuy nhiên, điều quan trọng là phải nhận thức được các tính năng bị gỡ bỏ và những thay đổi không tương thích ngược khi nâng cấp để đảm bảo một quá trình chuyển đổi suôn sẻ. ServBay giúp bạn tiếp cận các tính năng mới và tận hưởng việc lập trình với PHP 8.4!