为什么在静态上下文中不可能使用任何魔术常量?

问题描述:

在静态上下文中,是否有任何特别的理由拒绝在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没有任何意义,因为静态功能“不知道”来指代什么情况。

这里不是使用__DIR__或魔术常量,这里是不允许的。这是属性定义内部不允许的动态构造。如果您尝试在静态属性定义内连接两个原子字符串(如"a" . "b"),则还会出现语法错误。

From the docs:

像任何其他PHP静态变量,静态属性可以仅使用文字或常数来初始化;表达式是不允许的。所以,虽然你可以初始化一个静态属性为一个整数或数组(例如),但是你不能将它初始化为另一个变量,函数返回值或者一个对象....并且连接,即使是一个常量,也要计数作为不允许的表达。

PHP手册没有说明为什么用表达式的结果初始化静态变量是一个解析错误,但它很可能是由于事实,而不是运行时。

+0

谢谢,很高兴知道,但它确实没有回答真正的问题,这就是为什么它不是(“身体上”)可能。 – gremo 2012-02-18 01:55:24

+0

可能是因为init值是在编译时决定的(是的,PHP被编译为Zend引擎的操作码),而不是运行时。 – 2012-02-18 01:57:30

+0

@格雷莫看到我的加法。尽管在手册中没有明确说明它的原因,但我相信这是因为静态属性是在编译时而不是运行时解决的。 – 2012-02-18 01:59:38