这是我的测试:
<?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();
会产生解析错误。
在没有额外任务的情况下,是否有一种干净的方式来进行此呼叫?
答案 0 :(得分:1)
静态方法是功能的黑盒子,您可以明确定义(参数)和输出(返回值)中的所有内容。因此,它们不依赖于对象 - 您不应该使用对象引用来调用它们。只应使用static_method()
类中的HasStatic::static_method()
或self::static_method()
来调用HasStatic
。
静态方法没有任何内在错误 - 我强烈不同意tereško说应该避免使用它们。如果方法不需要对象的上下文,它也可以是静态的。
发生解析错误是因为没有理由在属性上使用范围解析运算符(::
)。变量类名称意味着以下内容将起作用:
$foo = 'HasStatic';
$foo::static_method(); // equivalent to HasStatic::static_method()
但是,该变量不能是属性 - 如果要以这种方式调用方法,则必须将其分配给临时变量。