在静态上下文中,是否有任何特殊原因拒绝在PHP中使用魔术常量(如__DIR__
)? OOP POV似乎没有错,因为__DIR__
是非全局特定的“全局”:
class MyClass
{
protected static $options = array(
'key1' => 2,
'key2' => __DIR__ .'/mypic.png' // Triggers a syntax error
);
public function __construct() {}
}
编辑有关此问题的说明。我对“为什么”这不可能感兴趣。例如,谈论静态的东西,任何人都知道这是不可能的:
public static function getName() { return $this->name; }
因为getName()
在多个实例之间共享,$this->name
没有任何意义,因为静态函数“不知道”要引用的实例。
答案 0 :(得分:4)
这里不特别使用__DIR__
或魔术常数,这是不允许的。它是属性定义中任何内容的动态构造,是不允许的。如果您尝试在静态属性定义中连接两个原子字符串(如"a" . "b"
),也会出现语法错误。
与任何其他PHP静态变量一样,静态属性只能使用文字或常量初始化;表达式是不允许的。因此,虽然您可以将静态属性初始化为整数或数组(例如),但您可能无法将其初始化为另一个变量,函数返回值或对象....并且连接甚至是常量计数作为一个不允许的表达。
PHP手册没有说明为什么用表达式的结果初始化静态变量是一个解析错误,但可能是因为static declarations are resolved at compile time而不是运行时。