我不想写长文,因为这是一个简短的问题。 PHPUnit测试包含几个静态的方法。例如,所有\PHPUnit\Framework\Assert::assert*()
methods以及identicalTo
,equalTo
。
我的IDE(具有IntelliSense /自动完成功能)不接受$this
的呼叫,但接受自己的呼叫。我已经知道静态函数应该通过类而不是对象来调用,所以self
。
更正确的是什么?
$this->assertTrue('test');
或
self::assertTrue('test');
(如果“$ this”更正确,你能指出为什么我们不应该使用“自我”吗?)
答案 0 :(得分:5)
通常,self
仅用于引用静态方法和属性(虽然令人困惑的是可以引用带有self
的非静态方法,以及静态方法$this
,前提是使用self
调用的方法未引用$this
。)
<?php
class Test {
public static function staticFunc() {echo "static ";}
public function nonStaticFunc() {echo "non-static\n";}
public function selfCaller() {self::staticFunc(); self::nonStaticFunc();}
public function thisCaller() {$this->staticFunc(); $this->nonStaticFunc();}
}
$t = new Test;
$t->selfCaller(); // returns "static non-static"
$t->thisCaller(); // also returns "static non-static"
在处理$this
或self
时,要记住继承非常重要。 $this
将始终引用当前对象,而self
引用使用self
的类。现代PHP还通过static
关键字包含late static binding,对于静态函数,它将以与$this
相同的方式运行(并且应该优先使用)。
<?php
class Person {
public static function whatAmI() {return "Human";}
public function saySelf() {printf("I am %s\n", self::whatAmI());}
public function sayThis() {printf("I am %s\n", $this->whatAmI());}
public function sayStatic() {printf("I am %s\n", static::whatAmI());}
}
class Male extends Person {
public static function whatAmI() {return "Male";}
}
$p = new Male;
$p->saySelf(); // returns "I am Human"
$p->sayThis(); // returns "I am Male"
$p->sayStatic(); // returns "I am Male"
特别是关于PHPUnit,看起来他们只是做事the way they've always done them!虽然根据他们的文档,your code should work fine使用静态方法。
答案 1 :(得分:3)
PHPUnit 4.8.9: vendor/phpunit/phpunit/src/Framework/Assert.php:
/**
* Asserts that a condition is true.
*
* @param bool $condition
* @param string $message
*
* @throws PHPUnit_Framework_AssertionFailedError
*/
public static function assertTrue($condition, $message = '')
{
self::assertThat($condition, self::isTrue(), $message);
}
技术上static::assertTrue()
是正确的,但断言方法的常见用法是$this->assertTrue()
。
答案 2 :(得分:2)
phpunit文档说您可以使用任何一个,而不是一个主张另一个。所以你选择! https://phpunit.readthedocs.io/en/9.2/assertions.html