Duplicate possible:
Nouveau moi vs nouveau statique
Quelle est la différence entre self
et static
dans l'exemple ci-dessous?
class Foo
{
protected static $bar = 1234;
public static function instance()
{
echo self::$bar;
echo "\n";
echo static::$bar;
}
}
Foo::instance();
1234
1234
Lorsque vous utilisez self
pour faire référence à un membre de la classe, vous faites référence à la classe dans laquelle vous utilisez le mot-clé. Dans ce cas, votre classe Foo
définit une propriété statique protégée appelée $bar
. Lorsque vous utilisez self
dans la classe Foo
pour faire référence à la propriété, vous faites référence à la même classe.
Par conséquent, si vous avez essayé d'utiliser self::$bar
ailleurs dans votre classe Foo
mais vous aviez une classe Bar
avec une valeur différente pour la propriété, elle utiliserait Foo::$bar
au lieu de Bar::$bar
, qui peut ne pas être ce que vous souhaitez:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
Lorsque vous utilisez static
, vous appelez une fonctionnalité appelée liaisons statiques tardives (introduite dans PHP 5.3).
Dans le scénario ci-dessus, utiliser static
au lieu de self
donnera Bar::$bar
utilisé au lieu de Foo::$bar
, car l’interprète prend alors en compte la redéclaration dans la classe Bar
.
Vous utilisez généralement des liaisons statiques tardives pour les méthodes, voire la classe elle-même, plutôt que des propriétés, car vous ne redéclarez pas souvent les propriétés dans les sous-classes; Vous trouverez un exemple d'utilisation du mot clé static
pour appeler un constructeur à liaison tardive dans la question suivante: Nouveau self vs new static
Cependant, cela n'empêche pas d'utiliser static
avec des propriétés également.
self - refers to the same class whose method the new operation takes place in.
static - in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on.
Dans l'exemple suivant (voir get_called_class () ), la classe B hérite des deux méthodes de la classe A. Self est lié à A car il est défini dans l'implémentation de la méthode de A, alors que static est lié à la classe appelée. malgré le fait que c'est aussi dans la mise en œuvre de la méthode de A.
class A {
public static function get_A() {
return new self();
}
public static function get_me() {
return new static();
}
}
class B extends A {}
echo get_class(B::get_A()); // A
echo get_class(B::get_me()); // B
echo get_class(A::get_me()); // A