La palabra reservada 'static'

Sugerencia

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.

Métodos estáticos

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.

Precaución

En PHP 5, llamar a métodos no estáticos de forma estática genera una advertencia de nivel E_STRICT.

Advertencia

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
?>

Propiedades estáticas

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";
?>
To Top