Что означает { }
(фигурные скобки) в строковых литералах в PHP?
Что означает { }
(фигурные скобки) в строковых литералах в PHP?
Ответы:
Это сложный (фигурный) синтаксис для интерполяции строк. Из руководства:
Сложный (фигурный) синтаксис
Это не называется сложным, потому что синтаксис сложен, а потому что он позволяет использовать сложные выражения.
С помощью этого синтаксиса может быть включена любая скалярная переменная, элемент массива или свойство объекта со строковым представлением. Просто напишите выражение так же, как оно будет выглядеть вне строки, а затем оберните его в
{
и}
. Поскольку{
не может быть экранирован, этот синтаксис будет распознаваться только тогда, когда$
непосредственно следует за{
. Используйте,{\$
чтобы получить буквальный{$
. Несколько примеров, чтобы прояснить это:<?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}"; 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()}"; ?>
Часто этот синтаксис не нужен. Например, это:
$a = 'abcd';
$out = "$a $a"; // "abcd abcd";
ведет себя точно так же, как это:
$out = "{$a} {$a}"; // same
Так что фигурные скобки не нужны. Но это :
$out = "$aefgh";
будет, в зависимости от вашего уровня ошибки, либо не работать, либо выдавать ошибку, потому что нет названной переменной $aefgh
, поэтому вам нужно сделать:
$out = "${a}efgh"; // or
$out = "{$a}efgh";
$vars='x:3,y:9'; $json="{{$vars}}";
. Благодаря статье QiGuang .
$out = '$aefgh'
; (если вам нужно буквально $ aefgh)
SimpleXMLElement
: {}
используется для доступа к самому узлу, например $element[0]->{0}
. Поскольку свойство "0" не может существовать, это вызовет метод __get
/ __set
. По сути, это позволяет вам использовать альтернативу ArrayAccess
для доступа к индексу, например, 3v4l.org/1F254 .
$min=1;$max=5; echo ".{{$min},{$max}}"
yields .{1,5}
(у меня были проблемы с пониманием того, где «удвоить [фигурные скобки]», упомянутое в комментарии @ BobStein)
Что касается меня, фигурные скобки служат заменой конкатенации, они быстрее набираются, а код выглядит чище. Не забудьте использовать двойные кавычки (""), так как их содержимое анализируется PHP, потому что в одинарных кавычках ('') вы получите буквальное имя переменной:
<?php
$a = '12345';
// This works:
echo "qwe{$a}rty"; // qwe12345rty, using braces
echo "qwe" . $a . "rty"; // qwe12345rty, concatenation used
// Does not work:
echo 'qwe{$a}rty'; // qwe{$a}rty, single quotes are not parsed
echo "qwe$arty"; // qwe, because $a became $arty, which is undefined
?>
SHIFT
нажать клавишу для двойных кавычек и для фигурных скобок. Было бы быстрее, если бы вы строго использовали двойные кавычки.
evaluate
вместоparse
Я также нашел полезным получить доступ к атрибутам объекта, где имена атрибутов меняются в зависимости от некоторых итераторов. Например, я использовал шаблон ниже для набора периодов времени: час, день, месяц.
$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
$this->{'value_'.$period}=1;
}
Этот же шаблон также можно использовать для доступа к методам класса. Просто создайте имя метода таким же образом, используя строки и строковые переменные.
Вы можете легко утверждать, что просто используете массив для хранения значений по периодам. Если бы это приложение было только PHP, я бы согласился. Я использую этот шаблон, когда атрибуты класса отображаются на поля в таблице базы данных. Хотя можно хранить массивы в базе данных с помощью сериализации, это неэффективно и бессмысленно, если отдельные поля должны быть проиндексированы. Я часто добавляю массив имен полей, вводимых с помощью итератора, для лучшего из обоих миров.
class timevalues
{
// Database table values:
public $value_hour; // maps to values.value_hour
public $value_day; // maps to values.value_day
public $value_month; // maps to values.value_month
public $values=array();
public function __construct()
{
$this->value_hour=0;
$this->value_day=0;
$this->value_month=0;
$this->values=array(
'hour'=>$this->value_hour,
'day'=>$this->value_day,
'month'=>$this->value_month,
);
}
}
вот код, который я получил от одного плагина WordPress
$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");
Это действительно удобная техника для форматирования сложных строк.