PHPUnit — использовать $ this или self для статических методов?

Я не хочу писать длинный текст, потому что это короткий вопрос. Тесты PHPUnit содержат несколько статических методов. Например, все те \PHPUnit\Framework\Assert::assert*() методы а также identicalTo, equalTo,

Моя IDE (с IntelliSense / автозаполнение) не принимает звонки с $this, но с самим собой. Я узнал, что статические функции должны вызываться через класс, а не объект, поэтому self,

Что правильнее?

$this->assertTrue('test');

или же

self::assertTrue('test');

?

(И если «$ this» более правильно, можете ли вы указать, почему мы не должны использовать «self»?)

17

Решение

В общем-то, 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, в частности, кажется, что они просто делают вещи как они всегда делали их! Хотя согласно их документации, ваш код должен работать нормально используя статические методы.

4

Другие решения

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

2

По вопросам рекламы [email protected]