Mehr ChangeLog Mehr ChangeLog

PHP 8.3 ist ein großes Update der PHP-Sprache.

Es enthält viele neue Funktionen, wie z. B. explizite Typisierung von Klassenkonstanten, Deep-Cloning von schreibgeschützten Eigenschaften und Ergänzungen zur Zufallsfunktionalität. Wie immer beinhaltet es auch Leistungsverbesserungen, Fehlerbehebungen und allgemeine Bereinigungen.

Jetzt auf PHP 8.3 upgraden!

Typisierte Klassenkonstanten

PHP < 8.3
interface I {
// We may naively assume that the PHP constant is always a string.
const PHP = 'PHP 8.2' ;
}

class Foo implements I {
// But implementing classes may define it as an array.
const PHP = [];
}
PHP 8.3
interface I {
const string PHP = 'PHP 8.2' ;
}

class Foo implements I {
const string PHP = [];
}
// Fatal error: Cannot use array as value for class constant
// Foo::PHP of type string

Dynamischer Klassenkonstantenabruf

PHP < 8.3
class Foo {
const PHP = 'PHP 8.2' ;
}

$searchableConstant = 'PHP' ;

var_dump ( constant ( Foo ::class . ":: { $searchableConstant } " ));
PHP 8.3
class Foo {
const PHP = 'PHP 8.3' ;
}

$searchableConstant = 'PHP' ;

var_dump ( Foo :: { $searchableConstant } );

New #[Override] attribute

PHP < 8.3
use PHPUnit\Framework\TestCase ;

final class MyTest extends TestCase {
protected $logFile ;

protected function setUp (): void {
$this -> logFile = fopen ( '/tmp/logfile' , 'w' );
}

protected function taerDown (): void {
fclose ( $this -> logFile );
unlink ( '/tmp/logfile' );
}
}

// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).
PHP 8.3
use PHPUnit\Framework\TestCase ;

final class MyTest extends TestCase {
protected $logFile ;

protected function setUp (): void {
$this -> logFile = fopen ( '/tmp/logfile' , 'w' );
}

#[ \Override ]
protected function taerDown (): void {
fclose ( $this -> logFile );
unlink ( '/tmp/logfile' );
}
}

// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).

By adding the #[Override] attribute to a method, PHP will ensure that a method with the same name exists in a parent class or in an implemented interface. Adding the attribute makes it clear that overriding a parent method is intentional and simplifies refactoring, because the removal of an overridden parent method will be detected.

Deep-Cloning von schreibgeschützten Eigenschaften

PHP < 8.3
class PHP {
public string $version = '8.2' ;
}

readonly class Foo {
public function __construct (
public PHP $php
) {}

public function __clone (): void {
$this -> php = clone $this -> php ;
}
}

$instance = new Foo (new PHP ());
$cloned = clone $instance ;

// Fatal error: Cannot modify readonly property Foo::$php
PHP 8.3
class PHP {
public string $version = '8.2' ;
}

readonly class Foo {
public function __construct (
public PHP $php
) {}

public function __clone (): void {
$this -> php = clone $this -> php ;
}
}

$instance = new Foo (new PHP ());
$cloned = clone $instance ;

$cloned -> php -> version = '8.3' ;

Nur-Lese-Eigenschaften können jetzt einmal innerhalb der magischen __clone-Methode geändert werden, um ein tiefes Klonen von Nur-Lese-Eigenschaften zu ermöglichen.

Neue json_validate()-Funktion

PHP < 8.3
function json_validate ( string $string ): bool {
json_decode ( $string );

return json_last_error () === JSON_ERROR_NONE ;
}

var_dump ( json_validate ( '{ "test": { "foo": "bar" }
}' )); // true
PHP 8.3
var_dump ( json_validate ( '{ "test": { "foo": "bar" }
}' )); // true

json_validate() ermöglicht die Überprüfung, ob eine Zeichenfolge syntaktisch gültiges JSON ist, ist dabei aber effizienter als json_decode().

Neue Randomizer::getBytesFromString()-Methode

PHP < 8.3
// This function needs to be manually implemented.
function getBytesFromString ( string $string , int $length ) {
$stringLength = strlen ( $string );

$result = '' ;
for ( $i = 0 ; $i < $length ; $i ++) {
// random_int is not seedable for testing, but secure.
$result .= $string [ random_int ( 0 , $stringLength - 1 )];
}

return $result ;
}

$randomDomain = sprintf (
"%s.example.com" ,
getBytesFromString (
'abcdefghijklmnopqrstuvwxyz0123456789' ,
16 ,
),
);

echo $randomDomain ;
PHP 8.3
// A \Random\Engine may be passed for seeding,
// the default is the secure engine.
$randomizer = new \Random\Randomizer ();

$randomDomain = sprintf (
"%s.example.com" ,
$randomizer -> getBytesFromString (
'abcdefghijklmnopqrstuvwxyz0123456789' ,
16 ,
),
);

echo $randomDomain ;

Die in PHP 8.2 hinzugefügte Random Extension wurde um eine neue Methode erweitert, um zufällige Strings zu generieren, die nur aus bestimmten Bytes bestehen. Mit dieser Methode kann der Entwickler problemlos zufällige Bezeichner wie Domänennamen und numerische Zeichenfolgen beliebiger Länge generieren.

Neue Methoden Randomizer::getFloat() und Randomizer::nextFloat()

PHP < 8.3
// Returns a random float between $min and $max, both including.
function getFloat ( float $min , float $max ) {
// This algorithm is biased for specific inputs and may
// return values outside the given range. This is impossible
// to work around in userland.
$offset = random_int ( 0 , PHP_INT_MAX ) / PHP_INT_MAX ;

return $offset * ( $max - $min ) + $min ;
}

$temperature = getFloat (- 89.2 , 56.7 );
$chanceForTrue = 0.1 ;
// getFloat(0, 1) might return the upper bound, i.e. 1,
// introducing a small bias.
$myBoolean = getFloat ( 0 , 1 ) < $chanceForTrue ;
PHP 8.3
$randomizer = new \Random\Randomizer ();

$temperature = $randomizer -> getFloat (
-89.2 ,
56.7 ,
\Random\IntervalBoundary :: ClosedClosed ,
);

$chanceForTrue = 0.1 ;
// Randomizer::nextFloat() is equivalent to
// Randomizer::getFloat(0, 1, \Random\IntervalBoundary::ClosedOpen).
// The upper bound, i.e. 1, will not be returned.
$myBoolean = $randomizer -> nextFloat () <
$chanceForTrue ;

Aufgrund der begrenzten Präzision und der impliziten Rundung von Gleitkommazahlen ist die Generierung einer unverzerrten Gleitkommazahl, die innerhalb eines bestimmten Intervalls liegt, nicht trivial und die häufig verwendeten Userland-Lösungen können verzerrte Ergebnisse oder Zahlen außerhalb des angeforderten Bereichs erzeugen.

Der Randomizer wurde außerdem um zwei Methoden erweitert, um zufällige Floats auf unvoreingenommene Weise zu generieren. Die Randomizer::getFloat()-Methode verwendet den γ-Abschnittsalgorithmus, der in „Drawing Random Floating-Point Numbers from an Interval“ veröffentlicht wurde. Frédéric Goualard, ACM Trans. Modell. Berechnen. Simultan, 32:3, 2022.

Befehlszeilen-Linter unterstützt mehrere Dateien

PHP < 8.3
php -l foo.php bar.php
No syntax errors detected in foo.php
PHP 8.3
php -l foo.php bar.php
No syntax errors detected in foo.php
No syntax errors detected in bar.php

Der Befehlszeilen-Linter akzeptiert jetzt verschiedene Eingaben für zu lintende Dateinamen

Neue Klassen, Schnittstellen und Funktionen

  • Neues DOMElement::getAttributeNames(), DOMElement::insertAdjacentElement(), DOMElement::insertAdjacentText(), DOMElement::toggleAttribute(), DOMNode::contains(), DOMNode::getRootNode(), DOMNode::isEqualNode(), Methoden DOMNameSpaceNode::contains() und DOMParentNode::replaceChildren().
  • Neue Methoden IntlCalendar::setDate(), IntlCalendar::setDateTime(), IntlGregorianCalendar::createFromDate() und IntlGregorianCalendar::createFromDateTime().
  • Neue Funktionen ldap_connect_wallet() und ldap_exop_sync().
  • Neue Funktion mb_str_pad().
  • Neue Funktionen posix_sysconf(), posix_pathconf(), posix_fpathconf() und posix_eaccess().
  • Neue ReflectionMethod::createFromMethodName()-Methode.
  • Neue Funktion socket_atmark().
  • Neue Funktionen str_increment(), str_decrement() und stream_context_set_options().
  • Neue ZipArchive::getArchiveFlag()-Methode.
  • Support for generation EC keys with custom EC parameters in OpenSSL extension.
  • Neue INI-Einstellung zend.max_allowed_stack_size zum Festlegen der maximal zulässigen Stapelgröße.
  • php.ini unterstützt jetzt die Fallback-/Standardwertsyntax.
  • Anonyme Klassen können jetzt schreibgeschützt sein.

Abwertungen und Abwärtskompatibilitätsunterbrechungen

  • Geeignetere Datums-/Uhrzeitausnahmen.
  • Durch Zuweisen eines negativen Index n zu einem leeren Array wird nun sichergestellt, dass der nächste Index n 1 statt 0 ist.
  • Änderungen an der Funktion range().
  • Changes in re-declaration of static properties in traits.
  • Die U_MULTIPLE_DECIMAL_SEPERATORS-Konstante ist zugunsten von U_MULTIPLE_DECIMAL_SEPARATORS veraltet.
  • Die Variante MT_RAND_PHP Mt19937 ist veraltet.
  • ReflectionClass::getStaticProperties() ist nicht mehr nullfähig.
  • Die INI-Einstellungen „assert.active“, „assert.bail“, „assert.callback“, „assertion.Exception“ und „assert.warning“ sind veraltet.
  • Der Aufruf von get_class() und get_parent_class() ohne Argumente ist veraltet.
  • SQLite3: Standardfehlermodus auf Ausnahmen eingestellt.
Bessere Leistung, bessere Syntax, verbesserte Typsicherheit. Jetzt auf PHP 8.3 upgraden!

Der Migrationsleitfaden ist im PHP-Handbuch verfügbar. Eine detaillierte Liste der neuen Funktionen und abwärtsinkompatiblen Änderungen finden Sie hier.

Wenn Sie frühere Versionen herunterladen müssen, können Sie diese anzeigen Mehr ChangeLog