From 4a8ed7ab68a398d8eb79ab4d82c5e30e3f496fae Mon Sep 17 00:00:00 2001 From: =?utf8?q?Johannes=20Schl=C3=BCter?= Date: Wed, 21 Nov 2007 00:03:16 +0000 Subject: [PATCH] - MFH ?: operator (Marcus) [DOC] "expr1 ?: expr1" is a shortcut for: "expr1 ? expr1 : expr2" as exists in gcc and discussed some time back. Note that this is not an implementation ifsetor($var, default). While ifsetor would not generate any message for non existing variables or array indices the ternary shortcut does. Also the ternary shortcut does a boolean evaluation rather then checking for isset(). That way ther ternary shortcut can work on any expression while ifsetor can only work on variables. Also to be silent one has do do: "@$expr1 ?: $expr2". --- Zend/tests/021.phpt | 27 +++++++++++++++++++++++++++ Zend/zend_language_parser.y | 3 +++ 2 files changed, 30 insertions(+) create mode 100644 Zend/tests/021.phpt diff --git a/Zend/tests/021.phpt b/Zend/tests/021.phpt new file mode 100644 index 0000000000..99fdb50258 --- /dev/null +++ b/Zend/tests/021.phpt @@ -0,0 +1,27 @@ +--TEST-- +?: operator +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +int(23) +string(3) "bar" +int(23) +float(23.5) +int(1) diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index a96c2a6f0f..2b32b3a35f 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -611,6 +611,9 @@ expr_without_variable: | expr '?' { zend_do_begin_qm_op(&$1, &$2 TSRMLS_CC); } expr ':' { zend_do_qm_true(&$4, &$2, &$5 TSRMLS_CC); } expr { zend_do_qm_false(&$$, &$7, &$2, &$5 TSRMLS_CC); } + | expr '?' { zend_do_begin_qm_op(&$1, &$2 TSRMLS_CC); } + ':' { zend_do_qm_true(&$1, &$2, &$4 TSRMLS_CC); } + expr { zend_do_qm_false(&$$, &$6, &$2, &$4 TSRMLS_CC); } | internal_functions_in_yacc { $$ = $1; } | T_INT_CAST expr { zend_do_cast(&$$, &$2, IS_LONG TSRMLS_CC); } | T_DOUBLE_CAST expr { zend_do_cast(&$$, &$2, IS_DOUBLE TSRMLS_CC); } -- 2.50.1