PHPUnit - 使用$this还是自置作为静态方法?

2022-08-30 15:21:16

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

我的 IDE(使用 IntelliSense/autocompletion)不接受 带有 的调用,而是接受与 self 的调用。我已经了解到静态函数应该通过类而不是对象来调用,所以.$thisself

什么更正确?

$this->assertTrue('test');

self::assertTrue('test');

?

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


答案 1

通常,仅用于引用静态方法和属性(尽管令人困惑的是,您可以使用 引用非静态方法,并使用 引用静态方法,前提是调用的方法不引用 。selfself$thisself$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"

在处理 或 时,请务必记住继承。 将始终引用当前对象,而引用所使用的类。现代 PHP 还通过关键字包含后期静态绑定,其操作方式与静态函数相同(并且应该优先)。$thisself$thisselfselfstatic$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,看起来他们只是按照他们一直以来的方式做事!尽管根据他们的文档,您的代码应该使用静态方法可以正常工作。


答案 2

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()


推荐