Gostaria de entender melhor por que, no cenário abaixo, há uma diferença na maneira como as constantes de classe são herdadas e as variáveis de instância.
<?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();
Resultado:
TWO
TWO
ONE
TWO
No código acima, ChildClass não tem um método showTest (), portanto, o método ParentClass showTest () é usado por herança. Os resultados mostram que, como o método está sendo executado na ParentClass, a versão ParentClass da constante TEST está sendo avaliada, enquanto, por estar avaliando dentro do contexto ChildClass por meio de herança, a variável de membro ChildClass $ test está sendo avaliada.
Eu li a documentação, mas não consigo ver qualquer menção a essa nuance. Alguém pode lançar alguma luz para mim?
php
oop
inheritance
overriding
constants
Tom Auger
fonte
fonte
final
...Respostas:
self::
Não é ciente de herança e sempre se refere à classe em que está sendo executado. Se você estiver usando o php5.3 +, você pode tentarstatic::TEST
comostatic::
está ciente de herança.A diferença é que
static::
usa "vinculação estática tardia". Encontre mais informações aqui:http://php.net/manual/en/language.oop5.late-static-bindings.php
Aqui está um script de teste simples que escrevi:
resultado
fonte
static::
.test()
não é um método estático, por que não usar$this::TEST
com PHP5.3 +?self::
/static::
mas não entendi por que usar emstatic::
vez de$this::
(nãoself::
). Existe uma diferença entre$this::
estatic::
(uma vez que existe um entrestatic::
/$this::
eself::
)?Em PHP, self se refere à classe na qual o método ou propriedade chamada é definida. Assim, no seu caso, você está chamando
self
emChildClass
, por isso usa a variável a partir dessa classe. Então você usaself
inParentClass
, então ele irá se referir à variável naquela classe.se você ainda quiser que a classe filha substitua o
const
da classe pai, ajuste o seguinte código em sua classe pai para isso:Observe a
static
palavra - chave. Isso usa "vinculação estática tardia". Agora sua classe pai chamará const de sua classe filha.fonte