Фігурні дужки в рядку в PHP


190

Яке значення { }(фігурні дужки) у рядкових літералах у PHP?



@ Quasimodo'sclone Це зовсім інше питання, і його не слід вважати дублікатом.
Дуве де Хаан

Відповіді:


281

Це складний (фігурний) синтаксис для інтерполяції рядків. З посібника:

Складний (фігурний) синтаксис

Це називається не складним, оскільки синтаксис складний, а тому, що він дозволяє використовувати складні вирази.

Будь-яка скалярна змінна, елемент масиву або об'єктна властивість із представленням рядка може бути включена через цей синтаксис. Просто запишіть вираз так само, як він з’явився б поза рядком, а потім загорніть його в {і }. Оскільки {неможливо уникнути, цей синтаксис буде розпізнаний лише тоді, коли $одразу слідує за {. Використовуйте {\$для отримання літералу {$. Деякі приклади, щоб це було зрозуміло:

<?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";

40
Занадто багато анального нахабства щодо копіювання / вставки. Якщо це легко зрозуміти / знайти, то це було хорошим рішенням. +1 від мене, це було саме те, що я шукав, і я не знайшов його в керівництві PHP - можливо, тому, що вони називають його власним іменем, чи як завгодно. Але я його знайшов тут.
Габріель Магана

9
Для буквальних кучерів подвійні їх, наприклад $vars='x:3,y:9'; $json="{{$vars}}";. Завдяки статті QiGuang в .
Боб Штейн

... Або $out = '$aefgh'; (якщо вам потрібен буквально $ aefgh)
Roko C. Buljan

Цікавим прикладом використання є SimpleXMLElement: {}використовується для доступу до самого вузла, наприклад $element[0]->{0}. Оскільки властивість "0" не може існувати, це запустить __get/ __setметод. Це по суті дає вам альтернативу ArrayAccessдля доступу до індексу, наприклад, 3v4l.org/1F254 .
Gajus

2
Якщо вміст у буквальних фігурних фігурних дужках також містить змінні, тоді додайте фігурні дужки до кожної змінної: $min=1;$max=5; echo ".{{$min},{$max}}"урожайність .{1,5}(у мене виникли проблеми, коли знати, де «подвоїти [фігурні дужки] вгору», згадане у коментарі @ BobStein)
Xenos

47

Як на мене, фігурні брекети служать заміною конкатенації, вони швидше набираються, а код виглядає чистіше. Не забудьте використовувати подвійні лапки (""), оскільки їх вміст аналізується 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

?>

1
"їх вміст аналізується PHP" - Це вводить в оману. Ви не можете просто помістити довільні вирази PHP всередині синтаксису фігурних дужок, про що я читав вашу цитату.
Марк Амері

1
IMO, загалом, не швидше набирати дужки. Ви повинні SHIFTнатиснути клавіші для подвійних лапок і для фігурних дужок. Хоча було б швидше, якщо ви строго використовуєте подвійні лапки.
затримка

2
Дякуємо, що виділили подвійні лапки v одиночні цитати, +1
cameronjonesweb

Я б використав evaluateзамістьparse
Cholthi Paul Ttiopic

17

Приклад:

$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";

Без фігурних дужок PHP намагатиметься знайти змінну з назвою $numberth, яка не існує!


3

Я також вважаю корисним отримати доступ до атрибутів об'єктів, де назви атрибутів залежать від ітератора. Наприклад, я використовував схему нижче для певного періоду часу: година, день, місяць.

$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,
        );
    }
}

-5

ось код, який я отримав з одного плагін WordPress

$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");

Це дійсно зручна техніка для форматування складних рядків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.