【发布时间】: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