Я не хочу писать длинный текст, потому что это короткий вопрос. Тесты PHPUnit содержат несколько статических методов. Например, все те \PHPUnit\Framework\Assert::assert*()
методы а также identicalTo
, equalTo
,
Моя IDE (с IntelliSense / автозаполнение) не принимает звонки с $this
, но с самим собой. Я узнал, что статические функции должны вызываться через класс, а не объект, поэтому self
,
Что правильнее?
$this->assertTrue('test');
или же
self::assertTrue('test');
?
(И если «$ this» более правильно, можете ли вы указать, почему мы не должны использовать «self»?)
В общем-то, 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
ключевое слово, которое будет работать так же, как (и должно быть предпочтительнее) $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, в частности, кажется, что они просто делают вещи как они всегда делали их! Хотя согласно их документации, ваш код должен работать нормально используя статические методы.
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()
правильно, но обычное использование методов assert $this->assertTrue()
,