在由实例属性引用的对象上调用静态方法时解析错误

时间:2013-09-23 21:42:58

标签: php

这是我的测试:

<?php

require __DIR__ . '/vendor/autoload.php';

class HasStatic {
  public static function static_method() {
    return true;
  }
}

class SUT {
  public $has_static;

  public function __construct() {
    $this->has_static = new HasStatic();
  }

  public function call_static() {
    // A parse error :<
    // $this->has_static::static_method();
    $has_static = $this->has_static;
    return $has_static::static_method();
  }

}

class PhpStaticCallOnProperty extends PHPUnit_Framework_TestCase {
  public function testPhpStaticCallOnProperty() {
    $sut = new SUT();
    $this->assertTrue($sut->call_static(), 'call_static() succeeded');
  }
} 

如您所见,我发现$this->has_static::static_method();会产生解析错误。

在没有额外任务的情况下,是否有一种干净的方式来进行此呼叫?

1 个答案:

答案 0 :(得分:1)

静态方法是功能的黑盒子,您可以明确定义(参数)和输出(返回值)中的所有内容。因此,它们不依赖于对象 - 您不应该使用对象引用来调用它们。只应使用static_method()类中的HasStatic::static_method()self::static_method()来调用HasStatic

静态方法没有任何内在错误 - 我强烈不同意tereško说应该避免使用它们。如果方法不需要对象的上下文,它也可以是静态的。

发生解析错误是因为没有理由在属性上使用范围解析运算符(::)。变量类名称意味着以下内容将起作用:

$foo = 'HasStatic';
$foo::static_method(); // equivalent to HasStatic::static_method()

但是,该变量不能是属性 - 如果要以这种方式调用方法,则必须将其分配给临时变量。