⁉️
PHP 8から三項演算子をネストするには括弧が必要になったらしい
PHPで三項演算子をネストすると左結合で評価されると聞いたので。。
問題
以下をコードをPHP 8以降の環境で実行すると何が出力されるでしょうか?
nested-ternary.php
$a = 1;
$b = 2;
echo $a === 1 ? 'one': $b === 2 ? 'two': 'other';
- one
- two
- other
- 上記以外
解答
PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /Users/foo/nested-ternary.php on line 5
正解は4. 上記以外のFatal errorでした。
なぜエラーになるの?
PHP 8から三項演算子をネストするには括弧が必要になったらしいです。下位互換のない変更点にシレッと書いてありました。
三項演算子をネストする場合、明示的に括弧が必要になりました。
RFCによると、元来PHPの三項演算子の結合規則が左結合であったため、他の言語と挙動が異なると混乱を招くからエラーになるようにした[1]ということだそうです。
明示的に括弧で囲ってあげればネストすることができます。
$a = 1;
$b = 2;
echo ($a === 1 ? 'one': $b === 2) ? 'two': 'other'; // two
$a = 1;
$b = 2;
echo $a === 1 ? 'one': ($b === 2 ? 'two': 'other'); //one
-
PHP 7.4では非推奨でPHP 8からエラーになる ↩︎
Discussion