⁉️

PHP 8から三項演算子をネストするには括弧が必要になったらしい

2023/06/17に公開

PHPで三項演算子をネストすると左結合で評価されると聞いたので。。

問題

以下をコードをPHP 8以降の環境で実行すると何が出力されるでしょうか?

nested-ternary.php
$a = 1;
$b = 2;
echo $a === 1 ? 'one': $b === 2 ? 'two': 'other';
  1. one
  2. two
  3. other
  4. 上記以外

解答

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
脚注
  1. PHP 7.4では非推奨でPHP 8からエラーになる ↩︎

Discussion