]> granicus.if.org Git - php/commitdiff
Added support for Class::{expr}() syntax (Pierrick)
authorDmitry Stogov <dmitry@php.net>
Mon, 1 Aug 2011 12:08:44 +0000 (12:08 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 1 Aug 2011 12:08:44 +0000 (12:08 +0000)
NEWS
Zend/tests/bug55247.phpt [new file with mode: 0644]
Zend/zend_language_parser.y

diff --git a/NEWS b/NEWS
index 8e3155262806e7e93552182c8a0e9643a97942e7..3ee63c0f5aee8e9d5ad379aa9aa12336aa8630ff 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@
  . Short array syntax, see UPGRADING guide for full details (rsky0711 at gmail 
    . com, sebastian.deutsch at 9elements . com, Pierre)
  . Binary numbers format (0b001010). (Jonah dot Harris at gmail dot com)
+ . Support for Class::{expr}() syntax (Pierrick)
 
 - Removed features:
   . Removed magic_quotes_gpc, magic_quotes_runtime and magic_quotes_sybase ini options.
diff --git a/Zend/tests/bug55247.phpt b/Zend/tests/bug55247.phpt
new file mode 100644 (file)
index 0000000..6fa893f
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+Request #55247 (Parser problem with static calls using string method name)
+--FILE--
+<?php
+class Test{
+    public static function __callStatic($method, $arguments)
+       {
+        echo $method . PHP_EOL;
+    }
+    public function __call($method, $arguments) 
+       {
+        echo $method . PHP_EOL;
+    }
+}
+
+$method = 'method';
+
+$test = new Test();
+
+$test->method();
+$test->$method();
+$test->{'method'}();
+
+Test::method();
+Test::$method();
+Test::{'method'}();
+--EXPECT--
+method
+method
+method
+method
+method
+method
index f89c1f121cb5ff629427947f898a41df6a9d753c..ef390ffd5606dfefc9f1d04b25e0e2747005b232 100644 (file)
@@ -797,13 +797,13 @@ function_call:
        |       T_NS_SEPARATOR namespace_name '(' { $3.u.op.opline_num = zend_do_begin_function_call(&$2, 0 TSRMLS_CC); }
                                function_call_parameter_list
                                ')' { zend_do_end_function_call(&$2, &$$, &$5, 0, $3.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
-       |       class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { $4.u.op.opline_num = zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
+       |       class_name T_PAAMAYIM_NEKUDOTAYIM variable_name '(' { $4.u.op.opline_num = zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
                        function_call_parameter_list
                        ')' { zend_do_end_function_call($4.u.op.opline_num?NULL:&$3, &$$, &$6, $4.u.op.opline_num, $4.u.op.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
        |       class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(&$3, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
                        function_call_parameter_list
                        ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
-       |       variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
+       |       variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_name '(' { zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
                        function_call_parameter_list
                        ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
        |       variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(&$3, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }