PHPUnit - 对静态方法使用$ this或self?

时间:2015-05-04 22:47:51

标签: php unit-testing oop phpunit self

我不想写长文,因为这是一个简短的问题。 PHPUnit测试包含几个静态的方法。例如,所有\PHPUnit\Framework\Assert::assert*() methods以及identicalToequalTo

我的IDE(具有IntelliSense /自动完成功能)不接受$this的呼叫,但接受自己的呼叫。我已经知道静态函数应该通过类而不是对象来调用,所以self

更正确的是什么?

$this->assertTrue('test');

self::assertTrue('test');

(如果“$ this”更正确,你能指出为什么我们不应该使用“自我”吗?)

3 个答案:

答案 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"

在处理$thisself时,要记住继承非常重要。 $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