Me gustaría comprender mejor por qué, en el escenario siguiente, hay una diferencia en la forma en que se heredan las constantes de clase frente a las variables de instancia.
<?php
class ParentClass {
const TEST = "ONE";
protected $test = "ONE";
public function showTest(){
echo self::TEST;
echo $this->test;
}
}
class ChildClass extends ParentClass {
const TEST = "TWO";
protected $test = "TWO";
public function myTest(){
echo self::TEST;
echo $this->test;
}
}
$child = new ChildClass();
$child->myTest();
$child->showTest();
Salida:
TWO
TWO
ONE
TWO
En el código anterior, ChildClass no tiene un método showTest (), por lo que el método showTest () de ParentClass se usa por herencia. Los resultados muestran que dado que el método se está ejecutando en ParentClass, se está evaluando la versión ParentClass de la constante TEST, mientras que debido a que se está evaluando dentro del contexto ChildClass a través de la herencia, se está evaluando la variable de miembro ChildClass $ test.
He leído la documentación, pero parece que no veo ninguna mención de este matiz. ¿Alguien puede arrojarme algo de luz?
php
oop
inheritance
overriding
constants
Tom Auger
fuente
fuente
final
...Respuestas:
self::
No es consciente de la herencia y siempre se refiere a la clase en la que se está ejecutando. Si está utilizando php5.3 +, puede intentarlostatic::TEST
ya questatic::
es consciente de la herencia.La diferencia es que
static::
utiliza "enlace estático tardío". Encuentre más información aquí:http://php.net/manual/en/language.oop5.late-static-bindings.php
Aquí hay un script de prueba simple que escribí:
salida
fuente
static::
.test()
que no es un método estático, ¿por qué no usarlo$this::TEST
con PHP5.3 +?self::
/static::
pero no entiendo por qué usar enstatic::
lugar de$this::
(noself::
). ¿Hay alguna diferencia entre$this::
ystatic::
(ya que hay una entrestatic::
/$this::
yself::
)?En PHP, self se refiere a la clase en la que se define el método o propiedad llamado. Por lo que en su caso está llamando
self
enChildClass
, por lo que utiliza la variable de esa clase. Luego usaself
inParentClass
, entonces se referirá a la variable en esa clase.Si aún desea que la clase secundaria anule la
const
de la clase principal, ajuste el siguiente código en su clase principal a esto:Tenga en cuenta la
static
palabra clave. Esto utiliza "enlace estático tardío". Ahora su clase principal llamará a la constante de su clase secundaria.fuente