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!
PHP 8.4 adds new DOM classes that are
spec-compliant, keeping the old ones for compatibility.
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!
PHP 8.4 adds new DOM classes that are
spec-compliant, keeping the old ones for compatibility.
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