Signatur
Beschreibung
Random\Randomizer ist die zentrale Klasse des in PHP 8.2 eingeführten Random-Namensraums. Sie kapselt den Zugriff auf eine Random\Engine und stellt darüber bequeme Methoden bereit, um Zufallszahlen, Bytes, Arrayelemente oder gemischte Sequenzen zu erzeugen – ohne selbst Details der Entropie-Erzeugung kennen zu müssen.
Die Engine wird im Konstruktor übergeben. Wird keine Engine angegeben, verwendet Randomizer standardmäßig Random\Engine\Secure, die kryptografisch sichere Zufallswerte (CSPRNG) liefert. Für reproduzierbare Tests eignet sich hingegen Random\Engine\Mt19937 mit festem Seed. Dadurch lassen sich Zufalls-abhängige Algorithmen einfach testen und verifizieren, indem lediglich die Engine ausgetauscht wird.
Im Vergleich zu älteren Funktionen wie rand(), mt_rand() oder shuffle() bietet Randomizer eine klar getrennte, testbare und wiederverwendbare Abstraktionsschicht. Alle Methoden sind thread-sicher, da der interne Zustand in der Engine-Instanz gekapselt ist.
- Kryptografisch sicher (Standard):
new Randomizer()odernew Randomizer(new Random\Engine\Secure()) - Reproduzierbar/testbar:
new Randomizer(new Random\Engine\Mt19937(42)) - Benutzerdefiniert: Eigene Engine-Implementierung möglich über das Interface
Random\Engine
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $engine | Random\Engine | new Random\Engine\Secure() | Die zu verwendende Zufallsengine. Wird nichts übergeben, verwendet Randomizer Random\Engine\Secure für kryptografisch sichere Werte. Für Tests kann z. B. Random\Engine\Mt19937 mit festem Seed genutzt werden. |
Rückgabewert
Beispiele
Kryptografisch sichere Zufallswerte (Standard)
<?php
use Random\Randomizer;
$rng = new Randomizer();
// Zufällige ganze Zahl zwischen 1 und 100
$zahl = $rng->getInt(1, 100);
echo "Zufallszahl: $zahl\n";
// 16 zufällige Bytes als Hex-String
$bytes = $rng->getBytes(16);
echo "Zufalls-Bytes (hex): " . bin2hex($bytes) . "\n";
// Zufälliges Element aus einem Array
$farben = ['rot', 'grün', 'blau', 'gelb'];
$picked = $rng->pickArrayKeys($farben, 2);
echo "Gezogene Schlüssel: " . implode(', ', $picked) . "\n";
// Array mischen (ohne Original zu verändern)
$gemischt = $rng->shuffleArray($farben);
echo "Gemischt: " . implode(', ', $gemischt) . "\n";
Reproduzierbare Zufallswerte für Unit-Tests
<?php
use Random\Randomizer;
use Random\Engine\Mt19937;
// Fester Seed → immer gleiche Sequenz
$rng = new Randomizer(new Mt19937(42));
echo $rng->getInt(1, 100) . "\n"; // immer gleicher Wert
echo $rng->getInt(1, 100) . "\n";
$woerter = ['Apfel', 'Birne', 'Kirsche', 'Pflaume', 'Mango'];
$gemischt = $rng->shuffleArray($woerter);
echo implode(', ', $gemischt) . "\n";
// Immer die gleiche Reihenfolge bei gleichem Seed
Zufälligen String aus Zeichenvorrat erzeugen
<?php
use Random\Randomizer;
$rng = new Randomizer();
// Zufälligen alphanumerischen Token erzeugen
$zeichen = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$token = $rng->getBytesFromString($zeichen, 32);
echo "Token: $token\n";
// Zufälligen Würfelwurf-String (D6, 10 Würfe)
$wuerfel = '123456';
$wurf = $rng->getBytesFromString($wuerfel, 10);
echo "Würfelwürfe: $wurf\n";
// Wichtig · Fallstricke
Sicherheitshinweis: Für sicherheitskritische Anwendungen (Tokens, Passwörter, CSRF-Schutz) grundsätzlich die Standard-Engine Random\Engine\Secure verwenden. Mt19937 ist nicht kryptografisch sicher und darf für solche Zwecke nicht eingesetzt werden.
Serialisierbarkeit: Randomizer-Instanzen sind serialisierbar – der interne Engine-Zustand wird mit serialisiert. Das kann nützlich sein, um den Zustand eines Zufallsgenerators zu speichern und fortzusetzen, birgt jedoch Risiken, wenn der Zustand einer unsicheren Engine (z. B. Mt19937) offengelegt wird.
Verfügbare Methoden im Überblick:
getInt(int $min, int $max): int– Zufallszahl im BereichgetBytes(int $length): string– Zufällige RohbytesgetBytesFromString(string $string, int $length): string– Zufällige Zeichen aus Zeichenvorrat (seit PHP 8.3)shuffleArray(array $array): array– Array mischen, Original bleibt unverändertshuffleBytes(string $bytes): string– Bytes-String mischenpickArrayKeys(array $array, int $num): array– Zufällige Schlüssel wählennextFloat(): float– Float im Bereich [0.0, 1.0) (seit PHP 8.3)getFloat(float $min, float $max): float– Float in gegebenem Bereich (seit PHP 8.3)