Signatur
Beschreibung
Das Interface Random\Engine ist die Basis-Schnittstelle des in PHP 8.2 eingeführten Zufallszahlensystems. Es schreibt genau eine Methode vor – generate() –, die einen String roher Zufallsbytes zurückgibt. Alle eingebauten Engines wie Random\Engine\Mt19937, Random\Engine\PcgOneseq128XslRr64, Random\Engine\Xoshiro256StarStar und Random\Engine\Secure implementieren dieses Interface.
Der Hauptzweck von Random\Engine ist die Entkopplung der Byte-Erzeugung von der höheren Abstraktionsebene. Die Klasse Random\Randomizer nimmt ein Random\Engine-Objekt entgegen und baut darauf alle komfortablen Zufallsmethoden (z. B. getInt(), shuffleArray()) auf. Dadurch können unterschiedliche Engines – reproduzierbare für Tests oder kryptografisch sichere für Produktion – ohne Codeänderung ausgetauscht werden.
Eigene Implementierungen sind möglich: Wer eine eigene deterministische oder externe Zufallsquelle einbinden möchte, implementiert Random\Engine und überschreibt generate(). Dabei muss die Methode stets einen nicht-leeren String zurückgeben, dessen Länge eine Potenz von 2 (1, 2, 4, 8 Bytes) ist, damit Random\Randomizer korrekt arbeitet.
Für kryptografisch sichere Zufallszahlen in Produktivsystemen sollte ausschließlich Random\Engine\Secure verwendet werden, da sie intern auf CSPRNG-Quellen des Betriebssystems zurückgreift.
Beispiele
Eigene Engine implementieren und mit Randomizer nutzen
<?php
use Random\Engine;
use Random\Randomizer;
// Eigene, reproduzierbare (nicht produktionsgeeignete) Engine
class ConstantEngine implements Engine
{
public function generate(): string
{
// Gibt immer denselben 4-Byte-Wert zurück – nur zu Demo-Zwecken!
return "\x01\x02\x03\x04";
}
}
$randomizer = new Randomizer(new ConstantEngine());
// Liefert deterministisch immer denselben Wert
echo $randomizer->getInt(0, 100) . PHP_EOL;
// Eingebaute kryptografisch sichere Engine
$secureRandomizer = new Randomizer(new Random\Engine\Secure());
echo $secureRandomizer->getInt(0, 100) . PHP_EOL;
Engine-Austausch für reproduzierbare Unit-Tests
<?php
use Random\Engine\Mt19937;
use Random\Randomizer;
// Seeded Engine für reproduzierbare Testergebnisse
$engine = new Mt19937(42);
$randomizer = new Randomizer($engine);
$shuffled = $randomizer->shuffleArray([1, 2, 3, 4, 5]);
echo implode(', ', $shuffled) . PHP_EOL;
// Mit demselben Seed ergibt sich immer dieselbe Reihenfolge
$engine2 = new Mt19937(42);
$randomizer2 = new Randomizer($engine2);
$shuffled2 = $randomizer2->shuffleArray([1, 2, 3, 4, 5]);
echo implode(', ', $shuffled2) . PHP_EOL;
// Wichtig · Fallstricke
Sicherheitshinweis: Eigene Implementierungen von Random\Engine sollten niemals in sicherheitskritischen Kontexten (z. B. Token-Generierung, Passwörter, kryptografische Schlüssel) eingesetzt werden, sofern sie nicht nachweislich auf einem CSPRNG basieren. Für solche Anwendungsfälle ist Random\Engine\Secure die einzig vertretbare Wahl.
Rückgabe-Anforderung: Die Methode generate() muss einen nicht-leeren String zurückgeben. Die Länge sollte eine Potenz von 2 (1, 2, 4 oder 8 Bytes) sein. Werden andere Längen zurückgegeben, kann Random\Randomizer eine Random\BrokenRandomEngineError werfen.
Das Interface existiert seit PHP 8.2 und ersetzt die vorherigen globalen Zufallsfunktionen nicht direkt, bietet aber eine saubere objektorientierte Alternative.