Lorsque vous utilisez selfpour 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 Fooclasse définit une propriété statique protégée appelée $bar. Lorsque vous utilisez selfdans la Fooclasse 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::$barailleurs dans votre Fooclasse mais que vous aviez une Barclasse avec une valeur différente pour la propriété, elle utiliserait à la Foo::$barplace 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 selfentraînera Foo::$bar(1234). Et l'utilisation staticdonnera Bar::$bar(4321) car avec static, l'interpréteur prend en compte la redéclaration au sein de la Barclasse 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 staticmot - 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 staticavec des propriétés.