В чем разница между этими двумя (в названии)?
Первый — это использование {$ var} против использования ‘string here’. $ Var.’another string ‘
Пример {$ Вар}:
<?php echo "Hello {$var}!;" ?>
Пример ‘string’. $ var.’string again ‘:
<?php echo '<strong style="color:#009900;">' . $username . ' is OK</strong>'; ?>
Приведенный ниже код поможет вам лучше понять фигурные скобки.
(код протестирован с PHP 5.5.12)
<?php
$p = 5;
$r = 6;
echo "{$p}{$r}"; //56
$a = "string";
echo ".$a."; //.string.
printf(".$b.");//undefined variable
echo "{}"; //{}
echo "$c"; //undefined variable
echo "{{$a}}"; //{string}
echo "{{$b}}"; //undefined variable
class a {
static $x = "xyz";
const x = "cdef";
function b() {
return "World";
}
static function d(){
return "php";
}
}
$xyz = "pqrs";
$cdef = "defg";
$c = new a;
echo "Hello {$c->b()}.\n"; //Hello world.
echo "Hello {a::d()}"; //{a::d()}
echo "Hello {${a::d()}}"; //undefined variable
echo "Hello {${a::$x}}"; //Hello pqrs
echo "Hello {${a::x}}"; //Hello defg
function g(){
return "gun";
}
echo "{g()}"; //{g()}
?>
Здесь важнее то, что код более читабелен и выглядит лучше, чем при написании с использованием оператора конкатенации (.). А также допускает сложное выражение, поэтому оно также называется сложным (фигурным) синтаксисом. От Вот Вы можете понять, что это в основном стиль письма, который вы предпочитаете.
Это называется «сложный (фигурный) синтаксис». И используется, чтобы специально указать переменное выражение в строке с двойными кавычками.
Другой, который вы упомянули, выходит из парсинга переменной в строке в двойных кавычках.
Как еще одно дополнение, {}
НЕОБХОДИМА, чтобы вы использовали многомерный массив или объект внутри "
строка в кавычках. например
$foo[1][2] = 'bar';
echo "hi $foo[1][2] mom"; // prints: hi Array[2] mom
echo "hi {$foo[1][2]} mom"; // prints: hi bar mom
Парсер PHP не «жадный», и как только он находит первый []
ключ для переменной массива, он не сканирует дальше для получения дополнительных ключей. Это означает, что ключи дочерних массивов будут игнорироваться, и теперь вы печатаете массив в строковом контексте, который является просто буквальным словом Array
,
То же самое для объектов:
$foo = new StdClass;
$foo->bar = new StdClass;
$foo->bar->baz = 'qux';
echo "hi $foo->bar->baz mom"; // prints: PHP catchable: Object of StdClass could not be converted to string
echo "hi {$foo->bar->baz} mom"; // prints: hi qux mom
В обоих случаях версии без скобок будут проанализированы / выполнены как эквивалент:
echo "hi " . $foo[1] . "[2] mom";
echo "hi " . $foo->bar . "->baz mom";