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