Solución:
En la primera clase, sayHi()
es en realidad un método de instancia al que está llamando como un método estático y se sale con la suya porque sayHi()
nunca se refiere a $this
.
Las funciones estáticas están asociadas con la clase, no una instancia de la clase. Como tal, $this
no está disponible en un contexto estático ($this
no apunta a ningún objeto).
Simplemente, las funciones estáticas funcionan independientemente de la clase a la que pertenecen.
$ esto significa que este es un objeto de esta clase. No se aplica a funciones estáticas.
class test {
public function sayHi($hi = "Hi") {
$this->hi = $hi;
return $this->hi;
}
}
class test1 {
public static function sayHi($hi) {
$hi = "Hi";
return $hi;
}
}
// Test
$mytest = new test();
print $mytest->sayHi('hello'); // returns 'hello'
print test1::sayHi('hello'); // returns 'Hi'
Toda la diferencia es que no obtienes $this
suministrado dentro de la función estática. Si intentas usar $this
, obtendrás un Fatal error: Using $this when not in object context
.
Bueno, está bien, otra diferencia: una E_STRICT
La advertencia es generada por su primer ejemplo.