https://www.php.net/releases/8.4/en.php [php-logo-w] * Downloads * Documentation * Get Involved * Help * PHP 8.4 [ ] Search docs PHP 8.4.1 Released! Getting Started Introduction A simple tutorial Language Reference Basic syntax Types Variables Constants Expressions Operators Control Structures Functions Classes and Objects Namespaces Enumerations Errors Exceptions Fibers Generators Attributes References Explained Predefined Variables Predefined Exceptions Predefined Interfaces and Classes Predefined Attributes Context options and parameters Supported Protocols and Wrappers Security Introduction General considerations Installed as CGI binary Installed as an Apache module Session Security Filesystem Security Database Security Error Reporting User Submitted Data Hiding PHP Keeping Current Features HTTP authentication with PHP Cookies Sessions Handling file uploads Using remote files Connection handling Persistent Database Connections Command line usage Garbage Collection DTrace Dynamic Tracing Function Reference Affecting PHP's Behaviour Audio Formats Manipulation Authentication Services Command Line Specific Extensions Compression and Archive Extensions Cryptography Extensions Database Extensions Date and Time Related Extensions File System Related Extensions Human Language and Character Encoding Support Image Processing and Generation Mail Related Extensions Mathematical Extensions Non-Text MIME Output Process Control Extensions Other Basic Extensions Other Services Search Engine Extensions Server Specific Extensions Session Extensions Text Processing Variable and Type Related Extensions Web Services Windows Only Extensions XML Manipulation GUI Extensions Keyboard Shortcuts ? This help j Next menu item k Previous menu item g p Previous man page g n Next man page G Scroll to bottom g g Scroll to top g h Goto homepage g s Goto search (current page) / Focus search box Change language: [English ] PHP 8.4 Released! PHP 8.4 is a major update of the PHP language. It contains many new features, such as property hooks, asymmetric visibility, an updated DOM API, performance improvements, bug fixes, and general cleanup. Upgrade to PHP 8.4 now! Property hooks RFC Doc 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 Property hooks provide support for computed properties that can natively be understood by IDEs and static analysis tools, without needing to write docblock comments that might go out of sync. Furthermore, they allow reliable pre- or post-processing of values, without needing to check whether a matching getter or setter exists in the class. Asymmetric Visibility RFC Doc PHP < 8.4 class PhpVersion { private string $version = '8.3'; public function getVersion(): string { return $this->version; } public function increment(): void { [$major, $minor] = explode('.', $this->version); $minor++; $this->version = "{$major}.{$minor}"; } } PHP 8.4 class PhpVersion { public private(set) string $version = '8.4'; public function increment(): void { [$major, $minor] = explode('.', $this->version); $minor++; $this->version = "{$major}.{$minor}"; } } The scope to write to a property may now be controlled independently from the scope to read the property, reducing the need for boilerplate getter methods to expose a property's value without allowing modification from the outside of a class. #[\Deprecated] Attribute RFC Doc 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(); // No indication that the method is deprecated. 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: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use PhpVersion::getVersion() instead echo $phpVersion->getPhpVersion(); The new #[\Deprecated] attribute makes PHP's existing deprecation mechanism available to user-defined functions, methods, and class constants. New ext-dom features and HTML5 support RFC RFC Doc PHP < 8.4 $dom = new DOMDocument(); $dom->loadHTML( <<<'HTML'
PHP 8.4 is a feature-rich release!
HTML, LIBXML_NOERROR, ); $xpath = new DOMXPath($dom); $node = $xpath->query(".//main/article[not(following-sibling::*)]")[0 ]; $classes = explode(" ", $node->className); // Simplified var_dump(in_array("featured", $classes)); // bool(true) PHP 8.4 $dom = Dom\HTMLDocument::createFromString( <<
PHP 8.4 is a feature-rich release!
HTML, LIBXML_NOERROR, ); $node = $dom->querySelector('main > article:last-child'); var_dump($node->classList->contains("featured")); // bool(true) New DOM API that includes standards-compliant support for parsing HTML5 documents, fixes several long-standing compliance bugs in the behavior of the DOM functionality, and adds several functions to make working with documents more convenient. The new DOM API is available within the Dom namespace. Documents using the new DOM API can be created using the Dom\HTMLDocument and Dom\XMLDocument classes. Object API for BCMath RFC PHP < 8.4 $num1 = '0.12345'; $num2 = 2; $result = bcadd($num1, $num2, 5); echo $result; // '2.12345' var_dump(bccomp($num1, $num2) > 0); // false PHP 8.4 use BcMath\Number; $num1 = new Number('0.12345'); $num2 = new Number('2'); $result = $num1 + $num2; echo $result; // '2.12345' var_dump($num1 > $num2); // false New BcMath\Number object enables object-oriented usage and standard mathematical operators when working with arbitrary precision numbers. These objects are immutable and implement the Stringable interface, so they can be used in string contexts like echo $num. New array_*() functions RFC 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" New functions array_find(), array_find_key(), array_any(), and array_all() are available. PDO driver specific subclasses RFC PHP < 8.4 $connection = new PDO( 'sqlite:foo.db', $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}", ); // Does not exist on a mismatching driver. $connection->query('SELECT prepend_php(version) FROM php'); New subclasses Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc, Pdo\ Pgsql, and Pdo\Sqlite of PDO are available. new MyClass()->method() without parentheses RFC Doc 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()); Properties and methods of a newly instantiated object can now be accessed without wrapping the new expression in parentheses. New Classes, Interfaces, and Functions * New Lazy Objects. * New JIT implementation based on IR Framework. * New request_parse_body() function. * New bcceil(), bcdivmod(), bcfloor(), and bcround() functions. * New RoundingMode enum for round() with 4 new rounding modes TowardsZero, AwayFromZero, NegativeInfinity, and PositiveInfinity. * New DateTime::createFromTimestamp(), DateTime::getMicrosecond(), DateTime::setMicrosecond(), DateTimeImmutable::createFromTimestamp(), DateTimeImmutable::getMicrosecond(), and DateTimeImmutable::setMicrosecond() methods. * New mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), and mb_lcfirst() functions. * New pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns(), and pcntl_waitid() functions. * New ReflectionClassConstant::isDeprecated(), ReflectionGenerator::isClosed(), and ReflectionProperty::isDynamic() methods. * New http_get_last_response_headers(), http_clear_last_response_headers(), and fpow() functions. * New XMLReader::fromStream(), XMLReader::fromUri(), XMLReader::fromString(), XMLWriter::toStream(), XMLWriter::toUri (), and XMLWriter::toMemory() methods. * New grapheme_str_split() function. Deprecations and backward compatibility breaks * The IMAP, OCI8, PDO_OCI, and pspell extensions have been unbundled and moved to PECL. * Implicitly nullable parameter types are now deprecated. * Using _ as a class name is now deprecated. * Raising zero to the power of a negative number is now deprecated. * Passing invalid mode to round() throws ValueError. * Class constants from extensions date, intl, pdo, reflection, spl, sqlite, xmlreader are typed now. * GMP class is now final. * MYSQLI_SET_CHARSET_DIR, MYSQLI_STMT_ATTR_PREFETCH_ROWS, MYSQLI_CURSOR_TYPE_FOR_UPDATE, MYSQLI_CURSOR_TYPE_SCROLLABLE, and MYSQLI_TYPE_INTERVAL constants have been removed. * mysqli_ping(), mysqli_kill(), mysqli_refresh() functions, mysqli::ping(), mysqli::kill(), mysqli::refresh() methods, and MYSQLI_REFRESH_* constants have been deprecated. * stream_bucket_make_writeable() and stream_bucket_new() now return an instance of StreamBucket instead of stdClass. * exit() behavioral change. * E_STRICT constant has been deprecated. Better performance, better syntax, improved type safety. Upgrade to PHP 8.4 now! For source downloads of PHP 8.4 please visit the downloads page. Windows binaries can be found on the PHP for Windows site. The list of changes is recorded in the ChangeLog. The migration guide is available in the PHP Manual. Please consult it for a detailed list of new features and backward-incompatible changes. * Copyright (c) 2001-2024 The PHP Group * My PHP.net * Contact * Other PHP.net sites * Privacy policy * View Source To Top [ ] | and | to navigate * Enter to select * Esc to close Press Enter without selection to search using Google