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

Wol*_*lvt 20 php oop phpunit unit-testing self

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

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

什么更正确?

$this->assertTrue('test');
Run Code Online (Sandbox Code Playgroud)

要么

self::assertTrue('test');
Run Code Online (Sandbox Code Playgroud)

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

mik*_*n32 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"
Run Code Online (Sandbox Code Playgroud)

处理$this或时要记住继承性self$this将始终引用当前对象,而self引用self所使用的类。现代PHP还通过关键字包括后期静态绑定static,该静态绑定的操作方式与$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"
Run Code Online (Sandbox Code Playgroud)

特别是对于PHPUnit来说,似乎他们只是按照自己一贯的方式做事!尽管根据他们的文档,您的代码应该可以使用静态方法正常工作