# String: Variable parsing

## Variable parsing

When a string is specified in double quotes or with heredoc, variables are parsed within it.

There are two types of syntax: a simple one and a complex one.

### Simple syntax

<?php
$juice = "apple"; echo "He drank some$juice juice.".PHP_EOL;
// Invalid. "s" is a valid character for a variable name, but the variable is $juice. echo "He drank some juice made of$juices.";
// Valid. Explicitly specify the end of the variable name by enclosing it in braces:
echo "He drank some juice made of ${juice}s."; ?> If a dollar sign ($) is encountered, the parser will greedily take as many tokens as possible to form a valid variable name.

It provides a way to embed a variable, an array value, or an object property in a string with a minimum of effort.

The simple syntax is the most common and convenient.

### Complex (curly) syntax

<?php
// Show all errors
error_reporting(E_ALL);

$great = 'fantastic'; // Won't work, outputs: This is { fantastic} echo "This is {$great}";

// Works, outputs: This is fantastic
echo "This is {$great}"; // Works echo "This square is {$square->width}00 centimeters broad.";

// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}"; // Works echo "This works: {$arr[4][3]}";

// This is wrong for the same reason as $foo[bar] is wrong outside a string. // In other words, it will still work, but only because PHP first looks for a // constant named foo; an error of level E_NOTICE (undefined constant) will be // thrown. echo "This is wrong: {$arr[foo][3]}";

// Works. When using multi-dimensional arrays, always use braces around arrays
// when inside of strings
echo "This works: {$arr['foo'][3]}"; // Works. echo "This works: " .$arr['foo'][3];

echo "This works too: {$obj->values[3]->name}"; echo "This is the value of the var named$name: {${$name}}";

echo "This is the value of the var named by the return value of getName(): {${getName()}}"; echo "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()}
echo "This is the return value of getName(): {getName()}";
?>
<?php
class foo {
var $bar = 'I am bar.'; }$foo = new foo();
$bar = 'bar';$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[1]}}\n";
?>
<?php
// Show all errors.
error_reporting(E_ALL);

class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa'; }$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s'; // This works; outputs: I'd like an A & W echo "I'd like an {${beers::softdrink}}\n";

// This works too; outputs: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
• Any scalar variable, array element or object property with a string representation can be included via this syntax.
• Simply write the expression the same way as it would appear outside the string, and then wrap it in { and }.
• Since { can not be escaped, this syntax will only be recognised when the $immediately follows the {. Use {\$ to get a literal {\$.
This isn't called complex because the syntax is complex, but because it allows for the use of complex expressions.

Variable parsing

## String: Variable parsing — Structure map

Clickable & Draggable!