Quando usi self
per fare riferimento a un membro della classe, ti riferisci alla classe all'interno della quale usi la parola chiave. In questo caso, la tua Foo
classe definisce una proprietà statica protetta chiamata $bar
. Quando si utilizza self
nella Foo
classe per fare riferimento alla proprietà, si fa riferimento alla stessa classe.
Pertanto, se hai provato a utilizzare self::$bar
altrove nella tua Foo
classe ma avevi una Bar
classe con un valore diverso per la proprietà, userebbe Foo::$bar
invece di Bar::$bar
, che potrebbe non essere quello che intendi:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
Quando chiami un metodo tramite static
, stai invocando una funzionalità chiamata binding statico tardivo (introdotto in PHP 5.3).
Nello scenario precedente, l'utilizzo self
risulterà in Foo::$bar
(1234). E l'utilizzo static
risulterà in Bar::$bar
(4321) perché con static
, l'interprete tiene conto della ridichiarazione all'interno della Bar
classe durante il runtime.
In genere si utilizzano collegamenti statici tardivi per i metodi o anche per la classe stessa, piuttosto che per le proprietà, poiché spesso non si dichiarano nuovamente le proprietà nelle sottoclassi; un esempio di utilizzo della static
parola chiave per invocare un costruttore ad associazione tardiva può essere trovato in questa domanda correlata: New self vs. new static
Tuttavia, ciò non preclude l'utilizzo anche static
con le proprietà.