2014-05-10 94 views
-1

我有一个简单的示例代码,其中我想将对象操作符与范围解析一起使用以获取类常量(PHP 5.5)。PHP - 在另一个对象中访问这个对象的const

<?php 


class A { 
    const MY_CONST = 'This is my const'; 
} 

class B { 

    private $property; 

    public function __construct(A $a) {  
     $this->property = $a; 

     echo $a::MY_CONST."<br />"; // works (1) 

     echo A::MY_CONST."<br />"; // works (2) 

     $obj = $this->property; 

     echo $obj::MY_CONST."<br />"; // works (3) 

     echo $this->property::MY_CONST; // doesn't work (4)    
    } 

} 

$b = new B(new A); 

该代码已在PHP 5.5.12中测试过,我不关心在这个问题中与早期PHP版本的兼容性。

问题是 - 如果将对象设置为其他类的属性(如(4)中所示,并且您希望将$ this与const名称一起使用,是否可以访问对象const? 1和2显然有效,3中的简单分配也起作用,但会增加一行。

如果这是不可能的,是否有任何理由否定它或简单的PHP开发人员决定如此或简单忘了使其工作?对我来说,这是相当奇怪的是,4不工作,但3工作没有任何问题

+0

你应该首先意识到你的错误:常量定义为_class_实体,而不是_instance_实体。即使PHP允许实例取消引用,如果您想引用实例“常量”,那么在逻辑中也是一个错误。所以如果PHP在这里有错误(显然,它有) - 那么它就是这样的事情,它允许类通过实例进行常量去引用,而不是在事物中,通过另一个类属性拥有者不可能引用这样的去引用 –

+1

也许,但在这个例子中,我并没有考虑逻辑,而是关于为什么第三种情况起作用,而第四种情况不起作用。无论是应该工作,或在我看来他们都没有 –

回答

1

回答你的问题是:是的,这是可能的。但在threee迂回的方式之一:

$tmp = $this->property; 
return $tmp::MY_CONST; 

或者,国际海事组织,一个更直观:

$class = get_class($this->property); 
return $class::MY_CONST; 

这样做的另一种方法是:

$r = new RefletionClass($this->property); 
return $r->getConstant('MY_CONSTANT'); 

至于你的代码生成解析器错误的原因,我不是100%确定的。但是,我可以告诉你,PHP语法非常复杂,而且有点麻烦。
虽然我不会感到惊讶,但要知道$this->foo::BAR是一个解析解析器的表达式,它解释了解析错误。

+0

这种解决方案比第三种情况更复杂,所以我恐怕这不是最好的解决方案(但也许是唯一的解决方案)。 –

+0

@MarcinNabiałek:对不起,没有注意到你已经在你发布的代码中工作(应该看起来更接近) –