From 24e365f9e2f82ed7833f5e2da9b9b5ca8a4a8a32 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 6 Jan 2020 14:51:00 +0100 Subject: [PATCH] Make encapsed strings fully dereferencable This allows operations that were previously allowed on constant strings on interpolated strings as well. --- .../varSyntax/encapsed_string_deref.phpt | 29 +++++++++++++++++++ Zend/zend_language_parser.y | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/varSyntax/encapsed_string_deref.phpt diff --git a/Zend/tests/varSyntax/encapsed_string_deref.phpt b/Zend/tests/varSyntax/encapsed_string_deref.phpt new file mode 100644 index 0000000000..e880f0f1ff --- /dev/null +++ b/Zend/tests/varSyntax/encapsed_string_deref.phpt @@ -0,0 +1,29 @@ +--TEST-- +Dereferencing operations on an encapsed string +--FILE-- +prop); +try { + var_dump("foo$bar"->method()); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +class FooBar { public static $prop = 42; } +var_dump("foo$bar"::$prop); + +function foobar() { return 42; } +var_dump("foo$bar"()); + +?> +--EXPECTF-- +string(1) "f" + +Warning: Trying to get property 'prop' of non-object in %s on line %d +NULL +Call to a member function method() on string +int(42) +int(42) diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 078c863c4e..22e0ebfa58 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -1102,6 +1102,7 @@ dereferencable_scalar: T_ARRAY '(' array_pair_list ')' { $$ = $3; $$->attr = ZEND_ARRAY_SYNTAX_LONG; } | '[' array_pair_list ']' { $$ = $2; $$->attr = ZEND_ARRAY_SYNTAX_SHORT; } | T_CONSTANT_ENCAPSED_STRING { $$ = $1; } + | '"' encaps_list '"' { $$ = $2; } ; scalar: @@ -1118,7 +1119,6 @@ scalar: | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$ = $2; } | T_START_HEREDOC T_END_HEREDOC { $$ = zend_ast_create_zval_from_str(ZSTR_EMPTY_ALLOC()); } - | '"' encaps_list '"' { $$ = $2; } | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; } | dereferencable_scalar { $$ = $1; } | constant { $$ = $1; } -- 2.40.0