======================================= Complex: Variable access ======================================= width}00 centimeters broad."; // Works, quoted keys only work using the curly brace syntax "This works: {$arr['key']}"; "This works: {$arr[4][3]}"; // Works. When using multi-dimensional arrays, always use braces around arrays // when inside of strings "This works: {$arr['foo'][3]}"; "This works: " . $arr['foo'][3]; "This works too: {$obj->values[3]->name}"; "This is the value of the var named $name: {${$name}}"; "This is the value of the var named by the return value of getName(): {${getName()}}"; "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}"; // Won't work, outputs: This is the return value of getName(): {getName()} "This is the return value of getName(): {getName()}"; "{$foo->$bar}\n"; "{$foo->{$baz[1]}}\n"; "I'd like an {${beers::softdrink}}\n"; "I'd like an {${beers::$ale}}\n"; --- (program (php_tag) (expression_statement (encapsed_string (string_content) (variable_name (name)))) (expression_statement (encapsed_string (string_content) (member_access_expression (variable_name (name)) (name)) (string_content))) (comment) (expression_statement (encapsed_string (string_content) (subscript_expression (variable_name (name)) (string (string_content))))) (expression_statement (encapsed_string (string_content) (subscript_expression (subscript_expression (variable_name (name)) (integer)) (integer)))) (comment) (comment) (expression_statement (encapsed_string (string_content) (subscript_expression (subscript_expression (variable_name (name)) (string (string_content))) (integer)))) (expression_statement (binary_expression (encapsed_string (string_content)) (subscript_expression (subscript_expression (variable_name (name)) (string (string_content))) (integer)))) (expression_statement (encapsed_string (string_content) (member_access_expression (subscript_expression (member_access_expression (variable_name (name)) (name)) (integer)) (name)))) (expression_statement (encapsed_string (string_content) (variable_name (name)) (string_content) (dynamic_variable_name (variable_name (name))))) (expression_statement (encapsed_string (string_content) (dynamic_variable_name (function_call_expression (name) (arguments))))) (expression_statement (encapsed_string (string_content) (escape_sequence) (string_content) (dynamic_variable_name (member_call_expression (variable_name (name)) (name) (arguments))))) (comment) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (member_access_expression (variable_name (name)) (variable_name (name))) (escape_sequence))) (expression_statement (encapsed_string (member_access_expression (variable_name (name)) (subscript_expression (variable_name (name)) (integer))) (escape_sequence))) (expression_statement (encapsed_string (string_content) (dynamic_variable_name (class_constant_access_expression (name) (name))) (escape_sequence))) (expression_statement (encapsed_string (string_content) (dynamic_variable_name (scoped_property_access_expression (name) (variable_name (name)))) (escape_sequence)))) ======================================= Simple: Variable access ======================================= john drank some $juices[0] juice.".PHP_EOL; "$people->john then said hello to $people->jane.".PHP_EOL; "$people->john's wife greeted $people->robert."; "The character at index -2 is $string[-2]."; --- (program (php_tag) (expression_statement (binary_expression (encapsed_string (member_access_expression (variable_name (name)) (name)) (string_content) (subscript_expression (variable_name (name)) (integer)) (string_content)) (name))) (expression_statement (binary_expression (encapsed_string (member_access_expression (variable_name (name)) (name)) (string_content) (member_access_expression (variable_name (name)) (name)) (string_content)) (name))) (expression_statement (encapsed_string (member_access_expression (variable_name (name)) (name)) (string_content) (member_access_expression (variable_name (name)) (name)) (string_content))) (expression_statement (encapsed_string (string_content) (subscript_expression (variable_name (name)) (unary_op_expression (integer))) (string_content)))) ========================================= Corner cases ========================================= tester- Hello"; " # x {$var->prop["key:"."key: {$var->func("arg")}"]}# x"; "hello \0 world"; "hello ${"a"."b"} world"; "$$$$$$$$$$$$$a"; "{$$$$$$$$b}"; "\{$"; "${a}["; "\u{$a}"; --- (program (php_tag) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (string_content) (escape_sequence))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (escape_sequence))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string)) (expression_statement (encapsed_string (escape_sequence) (string_content))) (expression_statement (encapsed_string (escape_sequence) (escape_sequence) (escape_sequence) (string_content))) (expression_statement (encapsed_string (escape_sequence) (string_content) (variable_name (name)) (string_content))) (expression_statement (encapsed_string (string_content) (variable_name (name)))) (expression_statement (encapsed_string (string_content) (variable_name (name)) (string_content))) (expression_statement (encapsed_string (string_content) (variable_name (name)))) (expression_statement (encapsed_string (scoped_call_expression (variable_name (name)) (name) (arguments)))) (expression_statement (encapsed_string (string_content) (member_access_expression (variable_name (name)) (name)) (string_content))) (expression_statement (encapsed_string (string_content) (subscript_expression (member_access_expression (variable_name (name)) (name)) (binary_expression (encapsed_string (string_content)) (encapsed_string (string_content) (member_call_expression (variable_name (name)) (name) (arguments (argument (encapsed_string (string_content)))))))) (string_content))) (expression_statement (encapsed_string (string_content) (escape_sequence) (string_content))) (expression_statement (encapsed_string (string_content) (dynamic_variable_name (binary_expression (encapsed_string (string_content)) (encapsed_string (string_content)))) (string_content))) (expression_statement (encapsed_string (string_content) (variable_name (name)))) (expression_statement (encapsed_string (dynamic_variable_name (dynamic_variable_name (dynamic_variable_name (dynamic_variable_name (dynamic_variable_name (dynamic_variable_name (dynamic_variable_name (variable_name (name))))))))))) (expression_statement (encapsed_string (string_content))) (expression_statement (encapsed_string (dynamic_variable_name (name)) (string_content))) (expression_statement (encapsed_string (string_content) (variable_name (name))))) ========================================= Single quoted ========================================= test {$b->c()[0]} asdfasdf EOF; << EOL; <<atlas?->go(); EOF; --- (program (php_tag) (expression_statement (nowdoc identifier: (heredoc_start) value: (nowdoc_body (nowdoc_string)) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) end_tag: (heredoc_end))) (comment) (expression_statement (nowdoc identifier: (heredoc_start) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) value: (nowdoc_body (nowdoc_string)) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) value: (nowdoc_body (nowdoc_string)) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) value: (nowdoc_body (nowdoc_string)) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) value: (nowdoc_body (nowdoc_string)) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) value: (nowdoc_body (nowdoc_string) (nowdoc_string) (nowdoc_string)) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) value: (nowdoc_body (nowdoc_string)) end_tag: (heredoc_end))) (expression_statement (nowdoc identifier: (heredoc_start) value: (nowdoc_body (nowdoc_string)) end_tag: (heredoc_end)))) ========================== Here/Nowdoc with numbers in identifier ==========================