Help us understand the problem. What is going on with this article?

定数式のバグ

More than 1 year has passed since last update.

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした