Фигурные скобки в строке в PHP - PullRequest
176 голосов
/ 08 апреля 2010

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

Ответы [ 5 ]

254 голосов
/ 08 апреля 2010

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

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

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

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

<?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";
46 голосов
/ 27 декабря 2012

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

?>
14 голосов
/ 10 марта 2013

Пример:

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

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

3 голосов
/ 06 марта 2017

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

$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,
        );
    }
}
0 голосов
/ 15 апреля 2012

вот код, который я получил от одного плагина WordPress

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...