CARVIEW |
It contains many new features, such as property hooks, asymmetric visibility, an updated DOM API, performance improvements, bug fixes, and general cleanup.
Property hooks RFC Doc
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
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->languageCode, $this->countryCode] = 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
Asymmetric Visibility RFC Doc
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}";
}
}
class PhpVersion
{
public private(set) string $version = '8.4';
public function increment(): void
{
[$major, $minor] = explode('.', $this->version);
$minor++;
$this->version = "{$major}.{$minor}";
}
}
#[\Deprecated]
Attribute RFC
Doc
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();
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();
#[\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
$dom = new DOMDocument();
$dom->loadHTML(
<<<'HTML'
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
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)
$dom = Dom\HTMLDocument::createFromString(
<<<'HTML'
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
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
$num1 = '0.12345';
$num2 = '2';
$result = bcadd($num1, $num2, 5);
echo $result; // '2.12345'
var_dump(bccomp($num1, $num2) > 0); // false
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
$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"
$animal = array_find(
['dog', 'cat', 'cow', 'duck', 'goose'],
static fn(string $value): bool => str_starts_with($value, 'c'),
);
var_dump($animal); // string(3) "cat"
PDO driver specific subclasses RFC
$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');
$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');
Pdo\Dblib
, Pdo\Firebird
, Pdo\MySql
, Pdo\Odbc
, Pdo\Pgsql
, and Pdo\Sqlite
of PDO
are available.
new MyClass()->method()
without parentheses RFC
Doc
class PhpVersion
{
public function getVersion(): string
{
return 'PHP 8.3';
}
}
var_dump((new PhpVersion())->getVersion());
class PhpVersion
{
public function getVersion(): string
{
return 'PHP 8.4';
}
}
var_dump(new PhpVersion()->getVersion());
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()
, andbcround()
functions. - New
RoundingMode
enum forround()
with 4 new rounding modesTowardsZero
,AwayFromZero
,NegativeInfinity
, andPositiveInfinity
. - New
DateTime::createFromTimestamp()
,DateTime::getMicrosecond()
,DateTime::setMicrosecond()
,DateTimeImmutable::createFromTimestamp()
,DateTimeImmutable::getMicrosecond()
, andDateTimeImmutable::setMicrosecond()
methods. - New
mb_trim()
,mb_ltrim()
,mb_rtrim()
,mb_ucfirst()
, andmb_lcfirst()
functions. - New
pcntl_getcpu()
,pcntl_getcpuaffinity()
,pcntl_getqos_class()
,pcntl_setns()
, andpcntl_waitid()
functions. - New
ReflectionClassConstant::isDeprecated()
,ReflectionGenerator::isClosed()
, andReflectionProperty::isDynamic()
methods. - New
http_get_last_response_headers()
,http_clear_last_response_headers()
, andfpow()
functions. - New
XMLReader::fromStream()
,XMLReader::fromUri()
,XMLReader::fromString()
,XMLWriter::toStream()
,XMLWriter::toUri()
, andXMLWriter::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()
throwsValueError
. - 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
, andMYSQLI_TYPE_INTERVAL
constants have been removed.mysqli_ping()
,mysqli_kill()
,mysqli_refresh()
functions,mysqli::ping()
,mysqli::kill()
,mysqli::refresh()
methods, andMYSQLI_REFRESH_*
constants have been deprecated.stream_bucket_make_writeable()
andstream_bucket_new()
now return an instance ofStreamBucket
instead ofstdClass
.exit()
behavioral change.E_STRICT
constant has been deprecated.
Better performance, better syntax, improved type safety.
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.
