]> granicus.if.org Git - php/commitdiff
- MFH ?: operator (Marcus)
authorJohannes Schlüter <johannes@php.net>
Wed, 21 Nov 2007 00:03:16 +0000 (00:03 +0000)
committerJohannes Schlüter <johannes@php.net>
Wed, 21 Nov 2007 00:03:16 +0000 (00:03 +0000)
  [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 [new file with mode: 0644]
Zend/zend_language_parser.y

diff --git a/Zend/tests/021.phpt b/Zend/tests/021.phpt
new file mode 100644 (file)
index 0000000..99fdb50
--- /dev/null
@@ -0,0 +1,27 @@
+--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)
index a96c2a6f0f10c74b9c0ff8b56b1d485b78930dc3..2b32b3a35feb58204fc26ffa07ea86df6494715b 100644 (file)
@@ -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); }