Compatibility Notes¶
PHP¶
Note
Random Extension doc on the PHP website: https://www.php.net/manual/en/book.random.php
The library aims to be compatible with ext-random
as released in PHP 8.2.0 and subsequent patch releases.
The library will not be a full replacement for ext-random
and total compatibility does not seem to be achievable.
Available classes:
Version 1.99.0¶
Version 1.99.0 is an empty package for PHP >= 8.2. It ensures that no overhead or extra code will be used for PHP 8.2+ apps.
Known differences¶
These differences are considered to be permanent features. However if you know how to fix them, ideas are welcome.
Serialization¶
Serialization is only compatible if done in PHP 7.4 and later.
Serializable entities implement
\Serializable
for controlled serialization in PHP 7.1 - 7.3.Entities serialized in PHP 7.1 - 7.3 can be unserialized with the polyfill under any version of PHP but will not be unserializable by the native extension.
Serialization in PHP 7.1 - 7.3 will trigger a warning. Silence it with
@
if you don’t care.Does not throw in GH-9186 case but also does not create a dynamic property (PHP 7.4+) Undefined behavior for PHP <7.4 (returns false with a warning for the given code)
Randomizer¶
pickArrayKeys()
messes a lot with the internal structure of the PHP hash tables and therefore may produce different results in the userland. Example from Tim Düsterhus:<?php $r1 = new Random\Randomizer(new Random\Engine\Xoshiro256StarStar(1)); $r2 = new Random\Randomizer(new Random\Engine\Xoshiro256StarStar(1)); $a = [ 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6, ]; unset($a['b']); $b = [ 'a' => 1, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6, ]; var_dump($a === $b); // bool(true) var_dump( $r1->pickArrayKeys($a, 1), // native: [ 0 => 'e' ], lib: [ 0 => 'd' ] $r2->pickArrayKeys($b, 1), // [ 0 => 'd' ] );
The interpreter operates on the actual hash table that looks different for these arrays. The lib “repacks” arrays and therefore returns
['d']
in both cases.
using
pickArrayKeys()
will trigger a warning if the engine is not CryptoSafeEngine. Silence it with@
if you don’t care.
Mt19937¶
Generating integers with
$max - $min >= mt_getrandmax()
withMT_RAND_PHP
is considered undefined behavior. This library is consistent with PHP 8.2 behavior, not the version it runs under.
Warnings¶
For obvious reasons, native extension produces E_WARNING
and the library produces E_USER_WARNING
.