Lorsque vous utilisez self
pour faire référence à un membre de classe, vous faites référence à la classe dans laquelle vous utilisez le mot-clé. Dans ce cas, votre Foo
classe définit une propriété statique protégée appelée $bar
. Lorsque vous utilisez self
dans la Foo
classe 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 Foo
classe mais que vous aviez une Bar
classe avec une valeur différente pour la propriété, elle utiliserait à la Foo::$bar
place de Bar::$bar
, ce qui n'est peut-être pas ce que vous prévoyez:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
Lorsque vous appelez une méthode via static
, vous invoquez une fonctionnalité appelée liaisons statiques tardives (introduite dans PHP 5.3).
Dans le scénario ci-dessus, l'utilisation self
entraînera Foo::$bar
(1234). Et l'utilisation static
donnera Bar::$bar
(4321) car avec static
, l'interpréteur prend en compte la redéclaration au sein de la Bar
classe lors de l'exécution.
Vous utilisez généralement des liaisons statiques tardives pour les méthodes ou même 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; un exemple d'utilisation du static
mot - clé pour appeler un constructeur à liaison tardive peut être trouvé dans cette question connexe: New self vs. new static
Cependant, cela n'empêche pas non plus d'utiliser static
avec des propriétés.