Comme noté on Reddit's LOL PHP sub, PHP 7 peut utiliser la classe étendue ou la classe de base en référence à self
, contrairement à PHP 5 qui fait toujours référence à la classe étendue.Dans quelles conditions PHP 7 se réfère-t-il à la classe de base?
<?php
class Foo {
const A = "FooA";
const B = self::A . self::C;
const C = "FooC";
}
class Bar extends Foo {
const A = "BarA";
const C = "BarC";
}
var_dump(Bar::B);
PHP 5
string(8) "BarABarC"
PHP 7
string(8) "FooABarC"
Le comportement de PHP 7 est particulièrement inquiétant car il ne semble pas être une règle simple de savoir lorsque self
fait référence à la classe de base ou à la classe étendue. Quelles sont les règles pour déterminer à quelle classe référencera self
en PHP 7?
https://stackoverflow.com/questions/10131786/how-does-self-exactly-work-in-inherited-classes – mkaatman
Il semble d'après le lien posté 3v7l qu'il y avait un changement de comportement (je suis pas en mesure de trouver un raisonnement si) entre PHP 5.6 et PHP 7.0 et aussi un bug en PHP de la version 7.0.0 à la version 7.1.3 ... Probablement préférable d'éviter de telles constructions ... –
Cela dépend de l'endroit où B est défini. Déplacez la définition de B autour et vérifiez la sortie. Si vous vous déplacez vers le bas, les sorties pour toutes les versions 7.x.x sont les mêmes. Déplacez-le vers le haut et vous remarquez une différence. – puelo