Declarar propiedades o métodos de clases como estáticos los hacen accesibles sin necesidad de una instanciación de la clase. Una propiedad declarada como static no puede ser accedida con un objeto de clase instanciado (pero sí se puede con métodos estáticos).
Por motivos de compatibilidad con PHP 4, si no se utiliza ninguna declaración de visibilidad, se tratará a las propiedades o métodos como si hubiesen sido definidos como public.
Debido a que los métodos estáticos se pueden invocar sin tener creada una instancia del objeto, la pseudo-variable $this no está disponible dentro de los métodos declarados como static.
Las propiedades estáticas no pueden ser accedidas a través del objeto utilizando el operador flecha (->).
Invocar métodos no estáticos estáticamente genera un Warning a nivel de E_STRICT
.
Como cualquier otra variable estática en PHP, las propiedades estáticas sólo pueden ser inicializadas utilizando una string literal o una constante; las expresiones no están permitidas. Por tanto, puede inicializar una propiedad estática con enteros o arrays (por ejemplo), pero no puede hacerlo con otra variable, con el valor de devolución de una función, o con un objeto.
A partir de PHP 5.3.0, es posible hacer referencia a una clase usando una variable. El valor de la variable no puede ser una palabra clave (por ej., self, parent y static).
Ejemplo #1 Ejemplo de propiedad estática
<?php
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // Undefined "Property" my_static
print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // A partir de PHP 5.3.0
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
Ejemplo #2 Ejemplo de método estático
<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // A partir de PHP 5.3.0
?>