PHP 8.2 起引入 Randomizer 类,8.3 增强其功能;8.1 及更早版本须用 random_int()/random_bytes(),禁用 mt_rand() 等不安全函数。

PHP 8.3 的 Randomizer 类无法在旧版本中直接使用——它从 PHP 8.2 才开始引入,PHP 8.1 及更早版本完全不支持。若项目需兼容多个 PHP 版本,不能简单“回退”到同名类,而应按运行时版本选择安全、可用的替代方案。
明确版本边界:哪些版本能用 Randomizer
\Random\Randomizer 是 PHP 8.2 新增的正式组件,在 PHP 8.2.0 起可用;PHP 8.3 对其做了增强(如 getBytesFromString()、getFloat() 等),但基础能力已在 8.2 稳定存在。PHP 8.1 及以下版本:没有该类,也无法通过扩展或 polyfill 补全——因为其依赖底层 Random\Engine 抽象和内核随机引擎集成,非纯 PHP 实现。
PHP 8.1 及更早:必须用 random_int() 和 random_bytes()
这两个函数自 PHP 7.0 起就已内置,是跨版本最可靠的选择,且与 Randomizer 同样基于加密安全随机源(/dev/urandom 或系统 CSPRNG):
-
random_int(1, 100)替代(new Randomizer())->getInt(1, 100) -
bin2hex(random_bytes(16))替代(new Randomizer())->getBytesFromString('abcdef0123456789', 16)(注意:后者需自行构造字符集,前者更通用) - 无需手动播种、无全局状态、不被弃用——PHP 8.3 中它们仍是推荐首选
避免降级陷阱:别用 mt_rand() 或 rand() 回退
有些项目为兼容旧版,会写类似 if (class_exists('Randomizer')) { ... } else { mt_rand() } 的逻辑,这是危险的:
-
mt_rand()在 PHP 8.3 已标记为 deprecated,调用会触发弃用警告;在严格错误处理环境中可能中断流程 - 它不是加密安全的,输出可预测,用于 token、salt、ID 等场景存在实际风险
- 全局状态易被污染(如其他库调用
mt_srand()),行为不可控
兼容性检测建议:运行时判断 + 统一抽象层
不推荐分散判断,建议封装一个轻量适配器:
- 检测
class_exists('Randomizer')且 PHP 版本 ≥ 8.2 → 使用Randomizer(获取浮点、打乱数组等高级能力) - 否则,统一走
random_int()/random_bytes()(覆盖 7.0–8.1 全系列) - 避免检查
function_exists('random_int')——它在 7.0+ 始终存在,无需额外 fallback
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











