Кудрявые скобки в строке в PHP

В чем смысл { } (фигурные скобки) в строковых литералах в PHP?

Ответы

Ответ 1

Это сложный (фигурный) синтаксис для интерполяции строк. Из руководства:

Сложный (фигурный) синтаксис

Это не называется сложным, потому что синтаксис является сложным, а потому он позволяет использовать сложные выражения.

Любая скалярная переменная, элемент массива или свойство объекта со строкой представление может быть включено через этот синтаксис. Просто напишите выражение так же, как оно было бы вне строки, и затем оберните его в { и }. Поскольку { не может быть экранирован, этот синтаксис будет распознаваться только тогда, когда $ следует за {. использование {\$, чтобы получить литерал {$. Некоторые примеры, чтобы дать понять:

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

Ответ 2

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

?>

Ответ 3

Пример:

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

Без фигурных скобок PHP попытается найти переменную с именем $numberth, которая не существует!

Ответ 4

Я также нашел полезным получить доступ к атрибутам объекта, где имена атрибутов зависят от некоторого итератора. Например, я использовал шаблон ниже для набора периодов времени: час, день, месяц.

$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");

Это действительно удобный способ форматирования сложных строк.