Jak wspomniano on Reddit's LOL PHP sub, PHP 7 może używać rozszerzonej klasy lub klasy bazowej, odnosząc się do self
, w przeciwieństwie do PHP 5, które zawsze odnosi się do rozszerzonej klasy.Na jakich warunkach samo PHP 7 odnosi się do klasy bazowej?
<?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"
Zachowanie PHP 7 jest szczególnie niepokojące, ponieważ nie wydaje się być dowolną prostą zasadę wiedzieć gdy self
odnosi się do klasy bazowej lub klasy rozszerzonej. Jakie są zasady określania, do której klasy odwoła się klasa self
w PHP 7?
https://stackoverflow.com/questions/10131786/how-does-self-exactly-work-in-inited-classes – mkaatman
Z opublikowanego linku 3v7l wynika, że nastąpiła zmiana w zachowaniu (jestem nie jest w stanie znaleźć żadnego uzasadnienia) między PHP 5.6 a PHP 7.0, a także błąd w PHP od wersji 7.0.0 do 7.1.3 ... Prawdopodobnie najlepiej, aby uniknąć takich konstrukcji ... –
To zależy od tego gdzie B jest zdefiniowane. Przenieś definicję B dookoła i sprawdź wynik. Jeśli przejdziesz na dół, wyjścia dla wszystkich wersji 7.x.x są takie same. Przenieś to na górę i zauważysz różnicę. – puelo