1

这是我的测试:

<?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();产生解析错误。

有没有一种干净的方法可以在没有额外分配的情况下拨打这个电话?

4

1 回答 1

1

静态方法是功能的黑盒,您可以在其中显式定义输入(参数)和输出(返回值)的所有内容。因此,它们与对象无关——您不应该使用对象引用来调用它们。static_method()只能使用HasStatic::static_method()self::static_method()HasStatic类中调用。

静态方法本身并没有什么问题——我强烈不同意 tereško 说应该避免使用它们。如果一个方法不需要对象的上下文,它也可以是静态的。

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

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

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

于 2013-09-23T21:56:03.227 回答