PHP5.6で定数式が使えるようになりました。
ところで問題です。
以下の出力はどうなるでしょう。
プログラム1
class A{
const X = self::A;
const A = 'A';
}
class B extends A{
const A = 'B';
}
print(A::X . B::X);
プログラム2
class A{
const X = self::A;
const A = 'A';
}
class B extends A{
const A = 'B';
}
print(B::X . A::X); // 違うのはここだけ
答えは……PHPのバージョンによって異なります。
というのはまあアレなので、7.0系最新の7.0.18で試してみると、
・プログラム1は"AA"
・プログラム2は"BB"
なんでだよ。
PHP5ではプログラム1、プログラム2共に"BA"となっていましたが(この時点で既におかしい)、PHP7ではプログラム1は"AA"に、プログラム2は"BB"となりました。
PHP7.1.4で後者が無事修正されて、両方とも正しく"AA"と出力されるようになりました。
まあこのプログラムの何が駄目かっていうと未定義の値を先に使ってるところで、順番に定義すれば何も問題なく正常に動作するから、こんな書き方するやつが悪いと言えますが。