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
définit une propriété statique protégée appelée $bar
. Lorsque vous utilisez self
dans le Foo
pour faire référence à la propriété, vous faites référence à la même classe.
Par conséquent, si vous essayez d'utiliser self::$bar
ailleurs dans votre Foo
mais vous aviez un Bar
avec une valeur différente pour la propriété, il utiliserait la classe Foo::$bar
au lieu de Bar::$bar
ce qui n'est peut-être pas votre intention :
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
Quand vous appelez une méthode via static
vous invoquez une fonction appelée liaisons statiques tardives (introduit en PHP 5.3).
Dans le scénario ci-dessus, l'utilisation de self
aura pour résultat Foo::$bar
(1234). Et en utilisant static
aura pour résultat Bar::$bar
(4321) car avec static
l'interpréteur prend en compte la redéclaration dans le fichier Bar
pendant l'exécution.
// self
var_dump(Foo::$bar);
// (int) 1234
// static
var_dump(Bar::$bar);
// (int) 4321
Vous utilisez généralement les liaisons statiques tardives pour les méthodes ou même la classe elle-même, plutôt que pour les propriétés, car vous ne redéclarez pas souvent les propriétés dans les sous-classes ; un exemple d'utilisation de l'option static
pour l'invocation d'un constructeur tardif se trouve dans cette question connexe : Nouveau soi vs. nouveau statique
Cependant, cela n'empêche pas d'utiliser static
avec des propriétés également.