PHPUnit-utiliser $this ou self pour les méthodes statiques?

je ne veux pas écrire un long texte, parce que c'est une question courte. Les tests PHPUnit contiennent plusieurs méthodes qui sont statiques. Par exemple tous ceux PHPUnitFrameworkAssert::assert*() méthode et identicalTo,equalTo.

mon IDE (avec IntelliSense/autocompletion) n'accepte pas les appels avec $this, mais avec soi-même. J'ai appris que statique les fonctions doivent être appelées par le biais de la classe, n'est pas un objet, donc self.

ce qui est plus - il correct?

$this->assertTrue('test');

ou

self::assertTrue('test');
<!--7?

(et si " $this "est plus correct, pouvez-vous peut-être indiquer pourquoi nous ne devrions pas utiliser"self"?)

16
demandé sur miken32 2015-05-05 01:47:51

2 réponses

en général,self n'est utilisé que pour faire référence à des méthodes et propriétés statiques (bien que vous non-méthodes statiques $this, fournit les méthodes appelées avec self ne faites pas référence à $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"

il est important de se souvenir de L'héritage lorsqu'on traite avec $this ou self. $this se référera toujours à l'objet courant, alors que self se réfère à la classe dans laquelle self a été utilisé. PHP moderne inclut aussi late static binding via le static mot clé, qui fonctionne de la même manière que (et doit être préférée à l') $this pour les fonctions statiques.

<?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 ce qui concerne PHPUnit en particulier, il semble qu'ils font simplement des choses la façon dont ils ont toujours fait leur! Bien que, selon leur documentation, votre code devrait fonctionner utilisant des méthodes statiques.

4
répondu miken32 2017-09-13 18:20:34

PHPUnit 4.8.9: vendeur/phpunit/phpunit/src/Cadre/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);
}

Techniquement static::assertTrue() est correct, mais l'usage commun de l'affirmer méthodes est $this->assertTrue().

2
répondu user1983686 2016-07-27 08:25:19