Фигурные скобки в строке в PHP

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

5 ответов


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

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

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

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

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

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