tutorial - PHPUnit: ¿usas $ this o self para métodos estáticos?
phpunit tutorial (2)
No quiero escribir un texto largo, porque es una pregunta corta. Las pruebas PHPUnit contienen varios métodos que son estáticos. Por ejemplo, todos esos métodos /PHPUnit/Framework/Assert::assert*()
y también los métodos identicalTo
, equalTo
.
Mi IDE (con IntelliSense / autocompletado) no acepta llamadas con $this
, pero sí. He aprendido que las funciones estáticas deben llamarse a través de la clase, no de un objeto, sino del self
.
¿Qué es más correcto?
$this->assertTrue(''test'');
o
self::assertTrue(''test'');
?
(Y si "$ esto" es más correcto, ¿puedes señalar por qué no deberíamos usar "yo"?)
En general, self
solo se usa para referirse a métodos y propiedades estáticos (aunque confusamente puede referirse a métodos no estáticos con self
, y a métodos estáticos con $this
, siempre que los métodos llamados con self
no hagan referencia a $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"
Es importante recordar la herencia cuando se trata de $this
o de self
. $this
siempre se referirá al objeto actual, mientras que self
refiere a la clase en la que se utilizó self
. PHP moderno también incluye un enlace estático tardío a través de la palabra clave static
, que funciona de la misma manera que (y debería preferirse a) $this
para funciones estáticas.
<?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"
En lo que respecta a PHPUnit en particular, ¡parece que simplemente hacen las cosas como siempre las han hecho ! Aunque de acuerdo con su documentación, su código debería funcionar bien usando métodos estáticos.
PHPUnit 4.8.9: vendedor / 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);
}
Técnicamente static::assertTrue()
es correcto, pero el uso común de los métodos de $this->assertTrue()
es $this->assertTrue()
.