Beschikbaar!
PHP 8.4 is een omvangrijke update van de PHP programmeertaal.
Het bevat veel nieuwe functionaliteit, zoals property hooks, asymmetrische zichtbaarheid, een bijgewerkte DOM API, prestatieverbeteringen, bugfixes en meer consistentie.

Property hooks RFC Documentatie

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->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
Property hooks geven ondersteuning voor berekende eigenschappen. Deze worden rechtstreeks ondersteund door IDEs en statische analyseprogramma’s, zonder dat documentatie blokken nodig zijn. Bovendien laten ze toe om waarden voor- of achteraf te verwerken zonder gebruik te maken van een getter of setter in de klasse.

Asymmetrische zichtbaarheid RFC Documentatie

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}";
}
}
De scope voor het schrijven naar een eigenschap kan nu onafhankelijk gecontroleerd worden ten opzichte van de scope om de eigenschap te lezen. Dit reduceert de nood voor repetitieve getter en setter methoden om de eigenschap bloot te stellen zonder aanpassing toe te laten buiten de klasse.

#[\Deprecated] attribuut RFC Documentatie

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();
Het nieuwe #[\Deprecated] attribuut maakt PHP’s bestaand uitfaseringsmechanisme beschikbaar voor gebruiker gedefinieerde functies, methoden en klasseconstanten.

Nieuwe ext-dom functies en HTML5 ondersteuning RFC RFC Documentatie

PHP < 8.4
$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)
PHP 8.4
$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)

Nieuwe DOM API met correcte ondersteuning voor de HTML 5 standaard, oplossingen voor verschillende lang bestaande compliance bugs in the DOM functionaliteit, en verschillende nieuwe functies om het werken met documenten eenvoudiger te maken.

De nieuwe DOM API is beschikbaar via de Dom namespace. Documenten die de nieuwe API willen gebruiken, kunnen aangemaakt worden via de Dom\HTMLDocument en Dom\XMLDocument klassen.

Object API voor 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

De nieuwe BcMath\Number klasse laat toe om op object-georiënteerde wijze, met standaard wiskundige operaties, te werken met arbitraire precisie getallen.

Deze objecten zijn niet muteerbaar en implementeren de Stringable interface, waardoor ze gebruikt kunnen worden in string contexten zoals echo $num.

Nieuwe array_*() functies 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"
Nieuwe functies array_find(), array_find_key(), array_any(), en array_all() zijn nu beschikbaar.

PDO driver specifieke SQL parsers 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');
Nieuwe subklassen Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc, Pdo\Pgsql, Pdo\Sqlite van PDO zijn nu beschikbaar.

new MyClass()->method() zonder haakjes RFC Documentatie

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());
Eigenschappen en methoden van een nieuw geïnstantieerd object kunnen nu opgevraagd worden zonder de new expressie tussen haakjes te zetten.

Nieuwe klassen, interfaces en functies

  • New Lazy Objects.
  • Nieuwe JIT implementation gebaseerd op IR Framework.
  • Nieuwe request_parse_body() functie.
  • Nieuwe bcceil(), bcdivmod(), bcfloor(), en bcround() functies.
  • Nieuwe RoundingMode enum voor round() met 4 nieuwe afrondingsmodi TowardsZero, AwayFromZero, NegativeInfinity, en PositiveInfinity.
  • Nieuwe DateTime::createFromTimestamp(), DateTime::getMicrosecond(), DateTime::setMicrosecond(), DateTimeImmutable::createFromTimestamp(), DateTimeImmutable::getMicrosecond(), en DateTimeImmutable::setMicrosecond() methoden.
  • Nieuwe mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), en mb_lcfirst() functies.
  • Nieuwe pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns(), en pcntl_waitid() functies.
  • Nieuwe ReflectionClassConstant::isDeprecated(), ReflectionGenerator::isClosed(), en ReflectionProperty::isDynamic() methoden.
  • Nieuwe http_get_last_response_headers(), http_clear_last_response_headers(), en fpow() functies.
  • Nieuwe XMLReader::fromStream(), XMLReader::fromUri(), XMLReader::fromString(), XMLWriter::toStream(), XMLWriter::toUri(), en XMLWriter::toMemory() methoden.
  • Nieuwe grapheme_str_split() functie.

Uitfaseringen en neerwaarts incompatibele aanpassingen

  • De IMAP, OCI8, PDO_OCI en pspell-extensies zijn ontbundeld en verplaatst naar PECL.
  • Impliciet parameters als null definiëren is nu uitgefaseerd.
  • Gebruik van _ als een klassenaam is nu uitgefaseerd.
  • Nul verheffen tot een negatieve macht is nu uitgefaseerd.
  • Ongeldige modus doorgeven aan round() resulteert in een ValueError.
  • Klasseconstanten van extensies date, intl, pdo, reflection, spl, sqlite, xmlreader hebben nu types.
  • GMP klasse is nu final.
  • MYSQLI_SET_CHARSET_DIR, MYSQLI_STMT_ATTR_PREFETCH_ROWS, MYSQLI_CURSOR_TYPE_FOR_UPDATE, MYSQLI_CURSOR_TYPE_SCROLLABLE, en MYSQLI_TYPE_INTERVAL constanten zijn verwijderd.
  • mysqli_ping(), mysqli_kill(), mysqli_refresh() functies, mysqli::ping(), mysqli::kill(), mysqli::refresh() methoden, en MYSQLI_REFRESH_* constanten zijn uitgefaseerd.
  • stream_bucket_make_writeable() en stream_bucket_new() geven nu een instantie van StreamBucket terug in plaats van stdClass.
  • exit() heeft ander gedrag.
  • E_STRICT constante is uitgefaseerd.
To Top