Llaves en cadena en PHP
¿Cuál es el significado de { }
(llaves) en cadenas literales en PHP?
Esta es la sintaxis compleja (rizada) para la interpolación de cadenas. Del manual:
Sintaxis compleja (rizada)
Esto no se llama complejo porque la sintaxis sea compleja, sino porque permite el uso de expresiones complejas.
Cualquier variable escalar, elemento de matriz u propiedad de objeto con una representación de cadena se puede incluir mediante esta sintaxis. Simplemente escriba la expresión de la misma manera que aparecería fuera de la cadena y luego envuélvala en
{
y}
. Como{
no se puede escapar, esta sintaxis solo se reconocerá cuando el siguiente$
sea inmediatamente posterior al{
. Úselo{\$
para obtener un literal{$
. Algunos ejemplos para que quede claro:
<?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 menudo, esta sintaxis es innecesaria. Por ejemplo, esto:
$a = 'abcd';
$out = "$a $a"; // "abcd abcd";
se comporta exactamente igual que este:
$out = "{$a} {$a}"; // same
Entonces las llaves son innecesarias. Pero esto :
$out = "$aefgh";
Dependiendo de su nivel de error, no funcionará o producirá un error porque no hay ninguna variable nombrada $aefgh
, por lo que debe hacer:
$out = "${a}efgh"; // or
$out = "{$a}efgh";
En lo que a mí respecta, las llaves sirven como sustituto de la concatenación, son más rápidas de escribir y el código se ve más limpio. Recuerde usar comillas dobles (" ") ya que PHP analiza su contenido , porque entre comillas simples (' ') obtendrá el nombre literal de la variable proporcionada:
<?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
?>
Ejemplo:
$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";
Sin llaves, PHP intentaría encontrar una variable llamada $numberth
, ¡que no existe!
También me resultó útil acceder a los atributos de los objetos donde los nombres de los atributos varían según algún iterador. Por ejemplo, he utilizado el siguiente patrón para un conjunto de períodos de tiempo: hora, día, mes.
$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
$this->{'value_'.$period}=1;
}
Este mismo patrón también se puede utilizar para acceder a métodos de clase. Simplemente cree el nombre del método de la misma manera, usando cadenas y variables de cadena.
Se podría argumentar fácilmente que se debe utilizar simplemente una matriz para el almacenamiento de valores por período. Si esta aplicación fuera sólo PHP, estaría de acuerdo. Utilizo este patrón cuando los atributos de clase se asignan a campos en una tabla de base de datos. Si bien es posible almacenar matrices en una base de datos mediante la serialización, es ineficiente y inútil si los campos individuales deben indexarse. A menudo agrego una matriz de nombres de campos, codificados por el iterador, para obtener lo mejor de ambos mundos.
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,
);
}
}