【问题标题】:PHP - access object const with this in another objectPHP - 在另一个对象中使用 this 访问对象 const
【发布时间】:2014-05-10 16:26:08
【问题描述】:

我有一个简单的示例代码,我想在其中使用对象运算符和范围解析来获取类常量(PHP 5.5)。

<?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 工作没有任何问题

【问题讨论】:

  • 你应该首先意识到你的错误:常量被定义为class实体,而不是instance实体。即使 PHP 允许实例取消引用,如果您想引用实例“常量”,这也是逻辑错误。因此,如果 PHP 在这里有错误(显然,它有) - 那么它在事物中,它允许通过实例取消引用类常量,而不是在事物中,通过另一个类属性持有者不可能进行这种取消引用跨度>
  • 也许吧,但在这个例子中,我考虑的不仅仅是逻辑,而是为什么第 3 种案例有效而第 4 种案例无效。在我看来,要么两者都应该工作,要么都不工作

标签: php class oop scope constants


【解决方案1】:

您的问题的答案是:是的,有可能。但是以三种迂回方式之一:

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

或者,IMO,一个更直观的

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

另一种方法是:

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

至于您的代码生成解析器错误的原因,我不能 100% 确定。但是,我可以告诉你,PHP 语法相当复杂,而且有点乱。
不过,如果我知道 $this-&gt;foo::BAR 是一个会导致解析器出错的表达式,我不会感到惊讶,这解释了解析错误。

【讨论】:

  • 这个解决方案比第三种情况还要复杂,所以恐怕它不是最好的解决方案(但可能是唯一的一个)。
  • @MarcinNabiałek:抱歉,没有注意到您已经在发布的代码中使用它(应该仔细查看)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2015-08-04
相关资源
最近更新 更多