]> granicus.if.org Git - php/commitdiff
Make encapsed strings fully dereferencable
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 6 Jan 2020 13:51:00 +0000 (14:51 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 11 Feb 2020 11:33:23 +0000 (12:33 +0100)
This allows operations that were previously allowed on constant
strings on interpolated strings as well.

Zend/tests/varSyntax/encapsed_string_deref.phpt [new file with mode: 0644]
Zend/zend_language_parser.y

diff --git a/Zend/tests/varSyntax/encapsed_string_deref.phpt b/Zend/tests/varSyntax/encapsed_string_deref.phpt
new file mode 100644 (file)
index 0000000..e880f0f
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Dereferencing operations on an encapsed string
+--FILE--
+<?php
+
+$bar = "bar";
+var_dump("foo$bar"[0]);
+var_dump("foo$bar"->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)
index 078c863c4ee6f22d10ccb4c5805e7e30cbbf55af..22e0ebfa58fc4bf6c91ae7471a1dc4789ac0a61c 100644 (file)
@@ -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; }