Php 为什么';在静态上下文中不可能使用任何魔法常量吗?
在静态上下文中,是否有任何特定的理由拒绝在PHP中使用魔法常量(如Php 为什么';在静态上下文中不可能使用任何魔法常量吗?,php,object,static,Php,Object,Static,在静态上下文中,是否有任何特定的理由拒绝在PHP中使用魔法常量(如\uuuuuu DIR\uuuuu?OOP POV似乎没有什么问题,因为\uuuuu DIR\uuuuu是“全局”的,而不是特定于实例的: class MyClass { protected static $options = array( 'key1' => 2, 'key2' => __DIR__ .'/mypic.png' // Triggers a sy
\uuuuuu DIR\uuuuu
?OOP POV似乎没有什么问题,因为\uuuuu DIR\uuuuu
是“全局”的,而不是特定于实例的:
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
没有任何意义,因为静态函数“不知道”引用哪个实例。这里不允许使用\uuuuuu DIR\uuuuuu
或魔法常量。它是属性定义中不允许的任何内容的动态构造。如果试图将两个原子字符串(如“a”)串联在一起,也会出现语法错误。静态属性定义中的“b”
与任何其他PHP静态变量一样,静态属性只能使用文本或常量初始化;不允许使用表达式。因此,虽然可以将静态属性初始化为整数或数组(例如),但不能将其初始化为另一个变量、函数返回值或对象。。。。连在一起,甚至连在一个常量上,也算作一个表达式,这是不允许的
PHP手册没有说明为什么用表达式的结果初始化静态变量是一个解析错误,但这可能是由于以下事实,而不是运行时。谢谢,很高兴知道,但它确实没有回答实际问题,这就是为什么它不是(比如“物理上”)可能。可能是因为init值是在编译时决定的(是的,PHP被编译成Zend引擎的操作码),而不是在运行时决定的。@Gremo请参阅我的添加内容。虽然手册中没有明确说明原因,但我相信这是因为静态属性是在编译时而不是运行时解析的。@Gremo答案可能对您的问题不准确,但实际上很有用。同样的无表达式限制也适用于实例属性和
const
s。