Esta página describe el uso de la palabra reservada static para definir métodos y propiedades estáticos. static también se puede usar para definir variables estáticas y para enlaces estáticos en tiempo de ejecución. Por favor, consulte estas páginas para más información sobre estos significados de static.
Declarar propiedades o métodos de clases como estáticos los hacen accesibles sin la necesidad de instanciar la clase. Una propiedad declarada como static no puede ser accedida con un objeto de clase instanciado (aunque un método estático sí lo puede hacer).
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 seudovariable $this no está disponible dentro de los métodos declarados como estáticos.
En PHP 5, llamar a métodos no estáticos de forma estática genera una
advertencia de nivel E_STRICT
.
En PHP 7, llamar a métodos no estáticos de forma estática está obsoleto y
generará una advertencia E_DEPRECATED
. El soporte para
las llamadas a métodos no estáticos de forma estática podría ser eliminado en el futuro.
Ejemplo #1 Ejemplo de método estático
<?php
class Foo {
public static function unMetodoEstatico() {
// ...
}
}
Foo::unMetodoEstatico();
$nombre_clase = 'Foo';
$nombre_clase::unMetodoEstatico(); // A partir de PHP 5.3.0
?>
No se puede acceder a las propiedades estáticas a través del objeto utilizando el operador flecha (->).
Como cualquier otra variable estática de PHP, las propiedades estáticas sólo pueden ser inicializadas utilizando un string literal o una constante; las expresiones no están permitidas. Por tanto, se puede inicializar una propiedad estática con enteros o arrays (por ejemplo), pero no se puede hacer 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 reservada (p.ej., self, parent y static).
Ejemplo #2 Ejemplo de propiedad estática
<?php
class Foo
{
public static $mi_static = 'foo';
public function valorStatic() {
return self::$mi_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$mi_static;
}
}
print Foo::$mi_static . "\n";
$foo = new Foo();
print $foo->valorStatic() . "\n";
print $foo->mi_static . "\n"; // "Propiedad" mi_static no definida
print $foo::$mi_static . "\n";
$nombreClase = 'Foo';
print $nombreClase::$mi_static . "\n"; // A partir de PHP 5.3.0
print Bar::$mi_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>