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
?
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
etnew 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
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"
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