From: Nikita Popov Date: Fri, 6 Jun 2014 15:05:14 +0000 (+0200) Subject: Accept static member fetch in new variable (BC) X-Git-Tag: POST_AST_MERGE^2~204 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c8aa51f82590d8353640a0470ed49f7a1a21fcaa;p=php Accept static member fetch in new variable (BC) --- diff --git a/Zend/tests/varSyntax/globalNonSimpleVariableError.phpt b/Zend/tests/varSyntax/globalNonSimpleVariableError.phpt new file mode 100644 index 0000000000..ed04921f89 --- /dev/null +++ b/Zend/tests/varSyntax/globalNonSimpleVariableError.phpt @@ -0,0 +1,10 @@ +--TEST-- +Global keyword only accepts simple variables +--FILE-- +bar; + +?> +--EXPECTF-- +Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ';' in %s on line %d diff --git a/Zend/tests/varSyntax/newVariable.phpt b/Zend/tests/varSyntax/newVariable.phpt new file mode 100644 index 0000000000..360f99ac36 --- /dev/null +++ b/Zend/tests/varSyntax/newVariable.phpt @@ -0,0 +1,39 @@ +--TEST-- +Variable as class name for new expression +--FILE-- + 'stdClass']; +$obj = (object) ['className' => 'stdClass']; + +class Test { + public static $className = 'stdClass'; +} +$test = 'Test'; +$weird = [0 => (object) ['foo' => 'Test']]; + +var_dump(new $className); +var_dump(new $array['className']); +var_dump(new $array{'className'}); +var_dump(new $obj->className); +var_dump(new Test::$className); +var_dump(new $test::$className); +var_dump(new $weird[0]->foo::$className); + +?> +--EXPECTF-- +object(stdClass)#%d (0) { +} +object(stdClass)#%d (0) { +} +object(stdClass)#%d (0) { +} +object(stdClass)#%d (0) { +} +object(stdClass)#%d (0) { +} +object(stdClass)#%d (0) { +} +object(stdClass)#%d (0) { +} diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index e28949d71c..013e3ddbf0 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -883,13 +883,8 @@ fully_qualified_class_name: class_name_reference: - class_name { zend_do_fetch_class(&$$, &$1 TSRMLS_CC); } - | dynamic_class_name_reference { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); zend_do_fetch_class(&$$, &$1 TSRMLS_CC); } -; - - -dynamic_class_name_reference: - new_variable { $$ = $1; } + class_name { zend_do_fetch_class(&$$, &$1 TSRMLS_CC); } + | new_variable { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); zend_do_fetch_class(&$$, &$1 TSRMLS_CC); } ; exit_expr: @@ -1115,6 +1110,11 @@ new_variable: | new_variable '{' expr '}' { fetch_string_offset(&$$, &$1, &$3 TSRMLS_CC); } | new_variable T_OBJECT_OPERATOR member_name { zend_do_fetch_property(&$$, &$1, &$3 TSRMLS_CC); } + | class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable + { zend_do_fetch_static_member(&$$, &$1, &$3 TSRMLS_CC); } + | new_variable T_PAAMAYIM_NEKUDOTAYIM simple_variable + { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); + zend_do_fetch_static_member(&$$, &$1, &$3 TSRMLS_CC); } ; dim_offset: