2011-02-03 21 views
5

¿Cuál es la diferencia entre estos dos códigos?php métodos estáticos pregunta

class something { 

    static function doit() { 
     echo 'hello world'; 
    } 
} 

something::doit(); 

y lo mismo pero sin la palabra clave estática

class something { 

    function doit() { 
     echo 'hello world'; 
    } 
} 

something::doit(); 

Ambos funcionan de la misma es mejor utilizar las palabras claves estáticas? ¿Estoy en lo cierto al entender que no crea una instancia de la clase si usa el método estático?

Respuesta

11

El segundo ejemplo es técnicamente incorrecto - si activa el error E_STRICT informes verá que PHP es en realidad lanzando un error.

PHP Strict Standards: Non-static method something::doit() should not be called statically in...

En otras palabras, está siendo agradable y le permite llamar a la función de todos modos.

0

segundo bit no debe funcionar como se debe llamar por

$something = new something(); 
$something->doit(); 

funciones estáticas le permite llamar a una función dentro de una clase sin que consturcting. Así que, básicamente, si tiene una clase para manejar usuarios, una función que registra al usuario debe ser una función estática, ya que en el constructor de esa clase probablemente recopile la información del usuario y no puede hacerlo sin iniciar sesión.

+0

Funciona para PHP4 y versiones inferiores. – Arvin

0

Su segundo ejemplo es incorrecto. El uso de un método estático no crea una instancia de la clase. Su segundo ejemplo se vería así:

$x = new something(); 
$x->doit(); 
1

La diferencia es que las funciones estáticas se pueden usar sin tener que crear una instancia de la clase.

Echa un vistazo a este gran tutorial de PHP OOP para principiantes here. Explica con más detalle un ejemplo en la sección Propiedades estáticas y métodos.

0

Los métodos estáticos deben ser declarados estática para un mínimo de dos razones:
a) cuando se utiliza E_STRICT error_reporting, llamando método no estático como estática generará error:
Strict standards: Non-static method something::doit() should not be called statically
b) en base a palabras clave static método de filtro de algunos IDE posible para ejecutar en autocompletar

4

Además de las otras respuestas válidas, la razón por la que el segundo ejemplo funciona también se debe a una peculiaridad en cómo maneja PHP los objetos y las llamadas (además de la compatibilidad con PHP 4). Llamar a un método declarado no static estáticamente desde otra instancia le permitirá acceder a los métodos de clase en otras clases como si fueran locales. Para entender, tomemos un ejemplo:

class A { 
    public function foo() { 
     echo get_class($this) . "\n"; 
    } 
} 

class B { 
    public function bar() { 
     A::foo(); 
    } 
} 

$a = new a(); 
$a->foo(); // "A" 
$b = new B(); 
$b->bar(); // "B" 

¿Viste lo que pasó allí? Como llamó al método A::foo()desde la instancia de otra clase, PHP trató la llamada como si estuviera en la misma instancia. Tenga en cuenta que no existe una relación entre A y B que no sea el hecho de que B llame al A. Dentro de A->foo(), si hiciéramos $this instanceof A (o $this instanceof self), ¡fallaría y devolvería falso! Bastante inusual...

Ahora, primero pensé que era un error, pero after reporting it, aparentemente es según diseño. Es even in the docs.

Tenga en cuenta que esto no funcionará con el modo E_STRICT habilitado. Tampoco funcionará si declara un método como static.