为什么PHP不支持将对象实例赋值给私有静态类字段?
问题原因解释
你遇到的报错和「私有静态字段不能存储对象」完全无关,核心原因是 PHP要求类属性的默认值必须是编译期可确定的常量表达式,new B()属于运行时才能执行的操作,编译阶段无法计算出固定结果,因此直接写在属性声明的赋值语句里就会触发你遇到的错误。
设计逻辑说明
PHP做这个限制是出于类结构一致性的考虑:
- 类的属性默认值会在编译阶段就写入类的基础结构,这个阶段业务代码还没有开始执行,自动加载、运行时环境都还没有完成初始化
- 如果允许属性默认值使用
new、函数调用、变量等运行时表达式,会导致类的初始结构依赖运行时状态,不同请求、不同加载顺序下可能出现类结构不一致,甚至会出现类编译完成后,new对应的类还没被自动加载的致命错误
修复方案
你只需要把静态属性改成懒加载初始化即可,修改后的A.php代码如下:
<?php require_once "B.php"; class A { // 先声明为可空类型,默认值设为编译期可识别的null private static ?B $inner = null; public static function getInstance() : B { // 首次调用时再做初始化 if (self::$inner === null) { self::$inner = new B(); } return self::$inner; } } ?>
修改后运行index.php即可正常输出预期结果。
内容的提问来源于stack exchange,提问作者Amir Hossein Najafi Zadeh
相关产品推荐
相关产品推荐

