Cuando usa self
para referirse a un miembro de la clase, se está refiriendo a la clase dentro de la cual usa la palabra clave. En este caso, su Foo
clase define una propiedad estática protegida llamada $bar
. Cuando usa self
en la Foo
clase para hacer referencia a la propiedad, hace referencia a la misma clase.
Por lo tanto, si intentó usar self::$bar
en otra parte de su Foo
clase, pero tenía una Bar
clase con un valor diferente para la propiedad, usaría en Foo::$bar
lugar de Bar::$bar
, que puede no ser lo que pretende:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
Cuando llamas a un método a través de static
, estás invocando una función llamada enlaces estáticos tardíos (introducidos en PHP 5.3).
En el escenario anterior, el uso self
resultará en Foo::$bar
(1234). Y el uso static
resultará en Bar::$bar
(4321) porque con static
, el intérprete tiene en cuenta la redeclaración dentro de la Bar
clase durante el tiempo de ejecución.
Por lo general, utiliza enlaces estáticos tardíos para métodos o incluso para la propia clase, en lugar de propiedades, ya que no suele volver a declarar propiedades en subclases; un ejemplo del uso de la static
palabra clave para invocar un constructor de enlace tardío se puede encontrar en esta pregunta relacionada: New self vs new static
Sin embargo, eso no excluye el uso también static
con propiedades.