PHP静态类存入数组报未定义常量警告,new关键字是合理解决方案吗?
问题原因分析
你遇到的警告是PHP的语法规则导致的:裸写的标识符默认会优先作为常量解析,未定义的常量才会被PHP弱类型转换为同名字符串,这个行为在PHP 8.0及以上版本已经被移除,会直接抛出致命错误,因此你最初的写法本身就不符合语法规范。
正确实现方案(无需实例化静态类)
你不需要用new关键字实例化类,PHP提供了::class语法专门用来获取类的全限定名字符串,写法如下:
$available_attributes = array( TextAttributeType::class, NumberAttributeType::class, ColorAttributeType::class, );
后续需要调用对应类的静态方法、访问静态属性时,直接用变量调用即可:
// 示例:调用静态方法 foreach ($available_attributes as $attributeType) { echo $attributeType::getTypeLabel(); }
关于实例化静态类是否违背设计初衷的解答
是的,这种做法不符合静态类的设计初衷:
- 静态类的核心设计目的就是全局可访问、无需实例化,所有功能都通过静态成员提供,部分规范的静态类甚至会把构造函数声明为私有,禁止外部实例化,此时你用
new关键字会直接报错。 - 通过实例调用静态成员虽然PHP语法允许,但属于不规范写法,同时会产生不必要的对象内存开销,完全没有必要。
内容的提问来源于stack exchange,提问作者Sarah Groß
相关产品推荐
相关产品推荐

