pregunta sobre los métodos estáticos php

¿Cuál es la diferencia entre estas dos piezas de código?

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 trabajan igual ¿es mejor usar las palabras clave estáticas? ¿Estoy en lo cierto al entender que no crea una instancia de la clase si usa el método estático?

El segundo ejemplo es técnicamente incorrecto: si activa el informe de error E_STRICT verá que PHP está lanzando un error.

Estándares estrictos de PHP: Método no estático algo :: doit () no debe llamarse estáticamente en …

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

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 static método declarado no static 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í? Debido a que 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 no sea el hecho de que B llama a 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 después de informarlo , aparentemente fue como fue diseñado . Incluso está en los documentos .

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

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

Eche un vistazo a este gran tutorial de PHP OOP para principiantes aquí . Se explica con más detalle con un ejemplo en la sección Propiedades y métodos estáticos .

El segundo bit no debería funcionar como debería llamarlo por

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

Las funciones estáticas le permiten llamar a una función dentro de una clase sin concretarla. Entonces, básicamente, si tienes una clase para manejar usuarios, entonces una función que registra al usuario debe ser una función estática, ya que en el constructor de esa clase probablemente recostackrás la información del usuario y no podrás hacerlo sin iniciar sesión.

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

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

Los métodos estáticos deben declararse estáticos por dos razones mínimas:
a) al usar E_STRICT error_reporting, llamar al método no estático como estático generará un error:
Strict standards: Non-static method something::doit() should not be called statically
b) basado en palabra clave static es posible ejecutar algún método de filtro de IDE en autocompletar.