Je voudrais mieux comprendre pourquoi, dans le scénario ci-dessous, il existe une différence dans la manière dont les constantes de classe sont héritées par rapport aux variables d'instance.
<?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();
Production:
TWO
TWO
ONE
TWO
Dans le code ci-dessus, ChildClass n'a pas de méthode showTest (), donc la méthode ParentClass showTest () est utilisée par héritage. Les résultats montrent que, puisque la méthode s'exécute sur ParentClass, la version ParentClass de la constante TEST est en cours d'évaluation, alors que comme elle est évaluée dans le contexte ChildClass via l'héritage, la variable membre ChildClass $ test est en cours d'évaluation.
J'ai lu la documentation, mais je ne vois aucune mention de cette nuance. Quelqu'un peut-il m'éclairer?
php
oop
inheritance
overriding
constants
Tom Auger
la source
la source
final
...Réponses:
self::
N'est pas compatible avec l'héritage et fait toujours référence à la classe dans laquelle il est exécuté. Si vous utilisez php5.3 +, vous pouvez essayerstatic::TEST
commestatic::
est compatible avec l'héritage.La différence est que
static::
utilise la "liaison statique tardive". Trouvez plus d'informations ici:http://php.net/manual/en/language.oop5.late-static-bindings.php
Voici un script de test simple que j'ai écrit:
production
la source
static::
.test()
n'est pas une méthode statique, pourquoi ne pas l'utiliser$this::TEST
avec PHP5.3 +?self::
/static::
mais je ne comprends pas pourquoi utiliserstatic::
au lieu de$this::
(pasself::
). Y a-t-il une différence entre$this::
etstatic::
(puisqu'il y en a un entrestatic::
/$this::
etself::
)?En PHP, self fait référence à la classe dans laquelle la méthode ou la propriété appelée est définie. Donc , dans votre cas , vous appelez
self
àChildClass
, il utilise la variable de cette classe. Ensuite, vous utilisezself
inParentClass
, donc il fera référence à la variable de cette classe.si vous souhaitez toujours que la classe enfant remplace celle
const
de la classe parent, ajustez le code suivant dans votre classe parent à ceci:Notez le
static
mot - clé. Ceci utilise une "liaison statique tardive". Maintenant, votre classe parent appellera le const de votre classe enfant.la source