LoginSignup
21
6

More than 5 years have passed since last update.

定数式のバグ

Last updated at Posted at 2017-04-26

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"と出力されるようになりました。

まあこのプログラムの何が駄目かっていうと未定義の値を先に使ってるところで、順番に定義すれば何も問題なく正常に動作するから、こんな書き方するやつが悪いと言えますが。

21
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
6