单例类构造函数必须为private以防止外部new创建实例同时需私有化__clone()和__wakeup()防止克隆与反序列化绕过并发场景下静态变量不可靠应使用文件锁或Redis锁trait中应使用static::而非self::避免实例共享。单例类的构造函数必须是 private否则外部能用 new 随意创建新实例直接破坏单例约束。PHP 不会自动阻止你 new 一个 public 构造函数的类——它只会默默照做然后你发现 $a $b 居然返回 false。实操建议立即学习“PHP免费学习笔记深入”把 __construct() 和 __clone() 都设为 private防止克隆绕过如果用了 __wakeup()反序列化场景也得设成 private不然 unserialize() 会新建对象别在构造函数里写耗时逻辑单例首次调用才触发但延迟加载不是万能解药——万一多个地方同时首次访问可能并发创建多个实例见下一条静态方法 getInstance() 要加双重检查锁PHP 7.4 可用 atomic纯静态变量缓存 直接 return在并发请求下大概率生成多个实例。PHP 的 static 变量作用域是请求级但多线程 SAPI如 PHP-FPM 多 worker或协程环境Swoole中static 并不跨进程/协程同步。实操建议立即学习“PHP免费学习笔记深入”简单脚本或 CLI 单进程场景用 private static $instance null; if (self::$instance null) 判断够用Web 环境尤其高并发必须加文件锁或 Redis 锁例如用 flock() 包裹实例化逻辑释放前写入 self::$instancePHP 8.1 可考虑 WeakMap 存储但仅限对象生命周期内不解决跨请求单例问题不能依赖 __sleep / __wakeup 实现单例保活反序列化时 __wakeup() 会被调用但它发生在新对象创建之后——也就是说即使你在 __wakeup() 里重赋值 self::$instance当前反序列化出的对象仍是独立实例跟原单例内存地址不同。 Vozo Vozo是一款强大的AI视频编辑工具可以帮助用户轻松重写、配音和编辑视频。