web-dev-qa-db-fra.com

Nouveau soi vs nouveau statique

Je suis en train de convertir une bibliothèque PHP 5.3 pour travailler sur PHP 5.2. La principale chose qui me gêne est l'utilisation d'une liaison statique tardive telle que return new static($options);, si je convertis cette propriété en return new self($options) obtiendra-t-elle les mêmes résultats?

Quelle est la différence entre new self et new static?

473
Mike

vais-je avoir les mêmes résultats?

Pas vraiment. Je ne connais pas de solution de contournement pour PHP 5.2, cependant.

Quelle est la différence entre new self et new static?

self fait référence à la même classe dans laquelle le mot clé new est réellement écrit.

static, dans PHP Les dernières liaisons statiques de 5.3, font référence à la classe de la hiérarchie dans laquelle vous avez appelé la méthode.

Dans l'exemple suivant, B hérite des deux méthodes de A. L'invocation self est liée à A car elle est définie dans l'implémentation de A de la première méthode, alors que static est lié à la classe appelée (voir aussi get_called_class() ).

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
826
BoltClock

Si la méthode de ce code n'est pas statique, vous pouvez obtenir une solution de contournement dans 5.2 en utilisant get_class($this).

class A {
    public function create1() {
        $class = get_class($this);
        return new $class();
    }
    public function create2() {
        return new static();
    }
}

class B extends A {

}

$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));

Les resultats:

string(1) "B"
string(1) "B"
19
Marius Balčytis

En plus des réponses des autres:

static :: sera calculé en utilisant les informations d'exécution.

Cela signifie que vous ne pouvez pas utiliser static:: dans une propriété de classe, car les valeurs des propriétés:

Doit pouvoir être évalué au moment de la compilation et ne doit pas dépendre des informations d'exécution.

class Foo {
    public $name = static::class;

}

$Foo = new Foo;
echo $Foo->name; // Fatal error

Utiliser self::

class Foo {
    public $name = self::class;

}
$Foo = new Foo;
echo $Foo->name; // Foo
5
FatalError