3v4l.org

run code in 300+ PHP versions simultaneously
<?php class A { private int $i = 1; // インスタンスが保持する変化する値 public function __toString(): string { // 文字列に変換されるたびに i の値が増えます。 return (string)$this->i++; } } // インスタンスをグローバル定数に割り当てます // これは PHP 8.1 から可能になった"引数デフォルト値にNew"の機能です // @see https://www.php.net/releases/8.1/ja.php#new_in_initializers // @see https://wiki.php.net/rfc/new_in_initializers const CONSTANT = new A; class B { // 新たな定数を文字列結合で構築します public const ClassConstant1 = '' . CONSTANT; public const ClassConstant2 = '' . CONSTANT; public const ClassConstant3 = '' . CONSTANT; public const ClassConstant4 = '' . CONSTANT; } // 定数を呼び出します // 呼び出したタイミングで定数が評価されます // これにより定義上で末尾ながらも最初に呼んだ ClassConstant4 が 1 を持ち、 // 最後に呼んだ ClassConstant1 が 4 を持ちます var_dump(B::ClassConstant4);// string(1) "1" var_dump(B::ClassConstant3);// string(1) "2" var_dump(B::ClassConstant2);// string(1) "3" var_dump(B::ClassConstant1);// string(1) "4" // 一度評価されるとその後は定まった値です var_dump(B::ClassConstant4);// string(1) "1" /* ↑の var_dump 群ではなく、次のコードを実行するとまた定数の値が変わります */ var_dump(B::ClassConstant1);// string(1) "1" var_dump(B::ClassConstant2);// string(1) "2" var_dump(B::ClassConstant3);// string(1) "3" var_dump(B::ClassConstant4);// string(1) "4"
Output for 8.1.0 - 8.1.30, 8.2.21 - 8.2.25, 8.3.5 - 8.3.14
string(1) "1" string(1) "2" string(1) "3" string(1) "4" string(1) "1" string(1) "4" string(1) "3" string(1) "2" string(1) "1"
Output for 7.4.0 - 7.4.30, 8.0.1 - 8.0.20
Fatal error: Constant expression contains invalid operations in /in/eCOpP on line 14
Process exited with code 255.

preferences:
30.3 ms | 407 KiB | 5 Q