【问题标题】:PHP: variable class in a class property - why calling static method return parse error? [duplicate]PHP:类属性中的变量类 - 为什么调用静态方法返回解析错误? [复制]
【发布时间】:2015-10-02 01:46:54
【问题描述】:

从 PHP 5.3 版开始,我们可以像这样call static method in a variable class

class A 
{
    public static function foo()
    {
        echo 'bar';
    }
}

$myVariableA = A::class;

$myVariableA::foo(); //bar

因此,鉴于下面的示例,我想了解为什么 B 类有效而 C 类无效:

class A 
{
    public static function foo()
    {
        echo 'bar';
    }
}

class B 
{
    protected $myVariableA;

    public function __construct()
    {
        $this->myVariableA = A::class;
    }

    public function doSomething()
    {
        $myVariableA = $this->myVariableA;
        return $myVariableA::foo(); //bar (no error)
    }
}

class C
{
    protected $myVariableA;

    public function __construct()
    {
        $this->myVariableA = A::class;
    }

    public function doSomething()
    {
        return $this->myVariableA::foo(); //parse error
    }
}

$b = new B;
$b->doSomething();

$c = new C;
$c->doSomething();

请注意,我不是试图解决这里的问题,但我想了解它发生的确切原因(如果可能,请提供实施细节)。

【问题讨论】:

  • 只是一个解析器“功能”,就像echo "$foo[1][2]" 输出Array[2] 而不是存储在[2] 索引中的任何内容。
  • @john-conde 我不认为它是重复的。在提到的问题中,当他应该使用 '->' 时,他正试图使用​​ '::' 访问实例对象的方法。我正在尝试调用未实例化的类的静态方法。该代码适用于局部变量,但不适用于类属性,我想了解原因。
  • @MarcB 我想了解为什么第二种情况有效(使用局部变量)而第一种情况(使用类属性)不起作用。如果我们可以在局部变量中使用'::'来调用静态方法,为什么我们不能在类属性中使用它?
  • 为了清楚起见,我已经编辑了这个问题。有什么办法可以将其取消标记为重复?

标签: php oop static-methods parse-error php-parse-error


【解决方案1】:

基于this,错误消息与双分号(::)有关。

在你的 doSomething() 上,尝试使用 myVariableA->foo();

【讨论】:

  • 问题不在于 T_PAAMAYIM_NEKUDOTAYIM 是什么。我知道这意味着 :: 并且它也被映射为 T_DOUBLE_COLON(我将编辑问题以澄清,谢谢)。
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多