Яке значення { }
(фігурні дужки) у рядкових літералах у 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}}"
урожайність .{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");
Це дійсно зручна техніка для форматування складних рядків.