Intereting Posts
Вставка карты Google в HTML-страницу на основе координат GPS Как отправить сообщение на другой сайт и получить результат без перенаправления Как переименовать во время копирования без изменения расширения? Как обрабатывать данные объекта из базы данных MySQL с помощью PHP PDO? Является ли ASCII «../» единственной последовательностью байтов, которая указывает на обход каталога в PHP? Использование одного и того же идентификатора сеанса в двух сценариях PHP одновременно Как использовать несколько баз данных в веб-приложении PHP? Сохранение корзины покупок: $ _SESSION или cookie браузера? PHP Дата Время Текущее время Добавить минуты MySQL – Как выполнить несколько запросов обновления в одной строке? PHP не работает, когда функция не определена? «Неизвестная» ошибка PHP – что это значит? Как загрузить (поток) большие файлы в symfony2 PHP Web Application (Magento) взломан; Что делает этот код хакера? unset vs. = NULL

Кудрявые скобки в строке в 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"; 

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

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