This allows operations that were previously allowed on constant
strings on interpolated strings as well.
--- /dev/null
+--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)
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:
| 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; }