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
.
Funciona para PHP4 y versiones inferiores. – Arvin