Primordial des constantes de classe vs propriétés
Je voudrais mieux comprendre pourquoi, dans le scénario ci-dessous, il y a une différence dans la façon dont les constantes de classe sont hérités vs 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();
De sortie:
TWO
TWO
ONE
TWO
Dans le code ci-dessus, ChildClass ne dispose pas d'un showTest() la méthode, de sorte que le Myclass showTest() la méthode utilisée par l'héritage. Les résultats montrent que la méthode est en cours d'exécution sur le Myclass, le Myclass version de la constante d'ESSAI est en cours d'évaluation, alors que parce que c'est de l'évaluation au sein de l'ChildClass contexte via l'héritage, la ChildClass membre de la variable $test est en cours d'évaluation.
J'ai lu la documentation, mais n'arrive pas à voir de toute mention de cette nuance. Quelqu'un peut jeter un peu de lumière pour moi?
- WTF? Constante primordial!? Ne faites pas ça! jamais!!!!
- En effet. Quelqu'un doit le communiquer à tous les développeurs de PHP. Ou au moins permettre à
final
...
Vous devez vous connecter pour publier un commentaire.
self::
N'est pas de l'héritage-conscient et se réfère toujours à la classe à laquelle il est exécuté. Si vous êtes en utilisant php5.3+ vous pouvez essayer destatic::TEST
commestatic::
est l'héritage-conscient.La différence est que
static::
utilise des "late static binding". Trouver plus d'informations ici:http://php.net/manual/en/language.oop5.late-static-bindings.php
Voici un test simple script que j'ai écrit:
sortie
static::
.test()
n'est pas une méthode statique, pourquoi ne pas utiliser$this::TEST
avec PHP5.3+?self::
/static::
différence, mais je ne comprends pas pourquoi à l'aide destatic::
au lieu de$this::
(pasself::
). Est-il une différence entre$this::
etstatic::
(car il y en a un entrestatic::
/$this::
etself::
)?static::
largement partout où je pourrais l'avoir déjà utiliséself::
. Je me demande si il n'y a aucun inconvénient à cela. En fait, c'est probablement digne de SE poser de question.En PHP, le soi désigne la classe dans laquelle la méthode ou la propriété est définie. Donc dans votre cas vous appelez
self
dansChildClass
, de sorte qu'il utilise la variable à partir de cette classe. Ensuite, vous utilisezself
dansParentClass
, il wil puis reportez-vous à la variable dans la classe.si vous voulez toujours la classe enfant pour remplacer le
const
de la classe parent, puis réglez le code suivant dans votre classe parent de ce:Note le
static
mot-clé. Ce est utilise "late static binding". Maintenant, vous êtes à la classe parent qui fera appel à la const de votre enfant en classe.