В чем смысл { }
(фигурные скобки) в строковых литералах в 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";
Что касается меня, фигурные скобки служат заменой конкатенации, они быстрее набирают и кодируют выглядит более чистым. Не забудьте использовать двойные кавычки (""), поскольку их содержимое анализируется 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 ?>
Пример:
$number = 4; print "You have the {$number}th edition book"; //output: "You have the 4th edition book";
Без фигурных скобок PHP попытается найти переменную с именем $numberth
, которой не существует!
Мне также было полезно получить доступ к атрибутам объекта, где имена атрибутов различаются на некоторых итераторах. Например, я использовал шаблон ниже для набора периодов времени: час, день, месяц.
$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");
Это очень удобный способ форматирования сложных строк.