PHP 8.5.8 Released!

Released!

PHP 8.2 ist ein Minor-Update der Sprache PHP und beinhaltet viele neue Features und Verbesserungen.
Unter anderem readonly Klassen, die Typen null, false und true und Performance-Optimierungen.

Readonly Klassen

PHP < 8.2
class BlogData
{
    public readonly string $title;

    public readonly Status $status;

    public function __construct(string $title, Status $status)
    {
        $this->title = $title;
        $this->status = $status;
    }
}
PHP 8.2 RFC Doc
readonly class BlogData
{
    public string $title;

    public Status $status;

    public function __construct(string $title, Status $status)
    {
        $this->title = $title;
        $this->status = $status;
    }
}

Disjunktive Normalform (DNF) Typen

DNF Typen erlauben die Nutzung von Verbund- und Intersektionstypen, durch das Befolgen von strikten Regeln: wenn Verbundstypen mit Intersektionstypen gleichzeitig genutzt werden müssen Intersektionstypen geklammert werden.

PHP < 8.2
class Foo {
    public function bar(mixed $entity) {
        if ((($entity instanceof A) && ($entity instanceof B)) || ($entity === null)) {
            return $entity;
        }

        throw new Exception('Invalid entity');
    }
}
PHP 8.2 RFC Doc
class Foo {
    public function bar((A&B)|null $entity) {
        return $entity;
    }
}

null, false, und true als eigene Typen

PHP < 8.2
class Falsy
{
    public function almostFalse(): bool { /* ... */ *}

    public function almostTrue(): bool { /* ... */ *}

    public function almostNull(): string|null { /* ... */ *}
}
PHP 8.2 RFC RFC
class Falsy
{
    public function alwaysFalse(): false { /* ... */ *}

    public function alwaysTrue(): true { /* ... */ *}

    public function alwaysNull(): null { /* ... */ *}
}

Neue "Random" Erweiterung

Die "random" Erweiterungen stellt eine neue objektorientierte API bereit, um Zufallszahlen zu generieren. Statt auf den global Seed des "random number generator (RNG)" zu setzen, welcher den Mersenne Twister Algorithmus nutzt, stellt die objektorientierte API mehrere Klassen ("Engine"s) mit modernen Algorithmen zur Verfügung, welche jeweils ihren eigenen und somit unabhängigen Seed setzen können.

Die \Random\Randomizer Klasse stellt Funktionen bereit, um Zufallszahlen zu generieren, Arrays oder auch Strings zufällig zu mischen und viele mehr.

use Random\Engine\Xoshiro256StarStar;
use Random\Randomizer;

$blueprintRng = new Xoshiro256StarStar(
    hash('sha256', "Example seed that is converted to a 256 Bit string via SHA-256", true)
);

$fibers = [];
for ($i = 0; $i < 8; $i++) {
    $fiberRng = clone $blueprintRng;
    // Xoshiro256**'s 'jump()' method moves the blueprint ahead 2**128 steps, as if calling
    // 'generate()' 2**128 times, giving the Fiber 2**128 unique values without needing to reseed.
    $blueprintRng->jump();

    $fibers[] = new Fiber(function () use ($fiberRng, $i): void {
        $randomizer = new Randomizer($fiberRng);

        echo "{$i}: " . $randomizer->getInt(0, 100), PHP_EOL;
    });
}

// The randomizer will use a CSPRNG by default.
$randomizer = new Randomizer();

// Even though the fibers execute in a random order, they will print the same value
// each time, because each has its own unique instance of the RNG.
$fibers = $randomizer->shuffleArray($fibers);
foreach ($fibers as $fiber) {
    $fiber->start();
}

Konstanten in Traits

Es kann nicht auf Konstanten eines Traits durch den Namen des Traits zugegriffen werden, jedoch über die implementierende Klasse.

PHP 8.2 RFC Doc
trait Foo
{
    public const CONSTANT = 1;
}

class Bar
{
    use Foo;
}

var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // Error

Missbilligung von Dynamische Properties

Das dynamische Erstellen / zuweisen von Properties wurden als veraltet markiert um Fehler zu vermeiden. Eine Klasse kann jedoch durch das Attribut #[\AllowDynamicProperties] weiterhin die Nutzung erlauben. Die stdClass erlaubt dynamische Properties weiterhin.

Die Nutzung von der magischen Methoden __get/__set sind nicht von dieser Änderung betroffen.

PHP < 8.2
class User
{
    public $name;
}

$user = new User();
$user->last_name = 'Doe';

$user = new stdClass();
$user->last_name = 'Doe';
PHP 8.2 RFC Doc
class User
{
    public $name;
}

$user = new User();
$user->last_name = 'Doe'; // Deprecated notice

$user = new stdClass();
$user->last_name = 'Doe'; // Still allowed

Veraltete Funktionalität und inkompatible Änderungen zu vorherigen PHP Versionen

To Top