¿Cuál es la diferencia entre self:: $ bar y static:: $ bar en PHP?
oop php-5.3 (2)
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 redeclaración 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