johannes Wed Nov 21 00:03:16 2007 UTC Added files: (Branch: PHP_5_3) /ZendEngine2/tests 021.phpt
Modified files: /ZendEngine2 zend_language_parser.y Log: - 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". http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_parser.y?r1=1.160.2.4.2.8.2.8&r2=1.160.2.4.2.8.2.9&diff_format=u Index: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.8 ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.9 --- ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.8 Tue Nov 20 08:53:02 2007 +++ ZendEngine2/zend_language_parser.y Wed Nov 21 00:03:16 2007 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.8 2007/11/20 08:53:02 dmitry Exp $ */ +/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.9 2007/11/21 00:03:16 johannes Exp $ */ /* * LALR shift/reduce conflicts and how they are resolved: @@ -611,6 +611,9 @@ | 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); } http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/021.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/021.phpt +++ ZendEngine2/tests/021.phpt --TEST-- ?: operator --FILE-- <?php var_dump(true ?: false); var_dump(false ?: true); var_dump(23 ?: 42); var_dump(0 ?: "bar"); $a = 23; $b = 0; $c = ""; $d = 23.5; var_dump($a ?: $b); var_dump($c ?: $d); var_dump(1 ?: print(2)); ?> --EXPECT-- bool(true) bool(true) int(23) string(3) "bar" int(23) float(23.5) int(1) --UEXPECT-- bool(true) bool(true) int(23) unicode(3) "bar" int(23) float(23.5) int(1)