¿Cuál es la diferencia entre self :: $ bar y static :: $ bar en PHP?

Posible duplicado:
Nuevo yo vs. nuevo estático

¿Cuál es la diferencia entre usar self y static en el siguiente ejemplo?

 class Foo { protected static $bar = 1234; public static function instance() { echo self::$bar; echo "\n"; echo static::$bar; } } Foo::instance(); 

produce

 1234 1234 

Cuando usa self para referirse a un miembro de la clase, se refiere a la clase dentro de la cual usa la palabra clave. En este caso, su clase Foo define una propiedad estática protegida llamada $bar . Cuando usa self en la clase Foo para referirse a la propiedad, está haciendo referencia a la misma clase.

Por lo tanto, si intentó usar self::$bar en otra parte de su clase Foo , pero tenía una clase Bar con un valor diferente para la propiedad, usaría Foo::$bar lugar de Bar::$bar , que puede no ser lo que intentas:

 class Foo { protected static $bar = 1234; } class Bar extends Foo { protected static $bar = 4321; } 

Cuando usa static , está invocando una característica llamada enlaces estáticos tardíos (introducida en PHP 5.3).

En el escenario anterior, usar static lugar de self dará como resultado Bar::$bar lugar de Foo::$bar , ya que el intérprete tendrá en cuenta la restatement dentro de la clase Bar .

Por lo general, utiliza enlaces estáticos tardíos para los métodos o incluso la propia clase, en lugar de propiedades, ya que a menudo no redeclara las propiedades en las subclases; un ejemplo del uso de la palabra clave static para invocar un constructor de enlace tardío se puede encontrar en esta pregunta relacionada: Nuevo yo vs. nuevo estático

Sin embargo, eso no excluye el uso de static con propiedades también.

 self - refers to the same class whose method the new operation takes place in. static - in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on. 

En el siguiente ejemplo (ver get_called_class () ), la clase B hereda ambos métodos de la clase A. El self está vinculado a A porque está definido en la implementación del método de A, mientras que static está vinculado a la clase llamada a pesar de que también está en La implementación de A del método.

 class A { public static function get_A() { return new self(); } public static function get_me() { return new static(); } } class B extends A {} echo get_class(B::get_A()); // A echo get_class(B::get_me()); // B echo get_class(A::get_me()); // A