Llaves en cadena en PHP


¿Cuál es el significado de { } (llaves) en literales de cadena en PHP?

 166
Author: Mark Amery, 2010-04-08

5 answers

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 es compleja, sino porque permite el uso de expresiones complejas.

Cualquier variable escalar, elemento de matriz u propiedad de objeto con una cadena la representación se puede incluir a través de esta sintaxis. Simplemente escriba el expresión de la misma manera que aparecería fuera de la cadena, y luego envuélvalo en { y }. Dado que { no se puede escapar, esta sintaxis solo se reconocerá cuando el $ siga inmediatamente al {. Utilizar {\$ para obtener un literal {$. Algunos ejemplos para dejarlo 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 esto:{[16]]}

$out = "{$a} {$a}"; // same

Así que las llaves son innecesarias. Pero esto :

$out = "$aefgh";

, dependiendo de su nivel de error, no funciona o produce un error porque no hay una variable llamada $aefgh, por lo que debe hacer:

$out = "${a}efgh"; // or
$out = "{$a}efgh";
 235
Author: cletus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-17 12:38:20

En cuanto a mí, las llaves sirven como una sustitución para la concatenación, son más rápidas para escribir y el código se ve más limpio. Recuerde usar comillas dobles ( "") ya que su contenido es analizado por PHP, porque en 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

?>
 42
Author: Kredo900,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-26 19:30:47

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!

 14
Author: Obiware,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-17 12:45:50

También he encontrado útil acceder a atributos de objetos donde los nombres de 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 usar para acceder a métodos de clase. Simplemente construye el nombre del método de la misma manera, usando cadenas y variables de cadena.

Podría argumentar fácilmente que solo se debe usar una matriz para el almacenamiento de valores por período. Si esta aplicación fuera solo PHP, lo haría acordar. Utilizo este patrón cuando los atributos de la clase se asignan a campos en una tabla de base de datos. Si bien es posible almacenar matrices en una base de datos mediante serialización, es ineficiente e inútil si los campos individuales deben indexarse. A menudo agrego una matriz de los nombres de campo, con la clave del iterador, para 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,
        );
    }
}
 2
Author: Ray N. Franklin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-06 18:39:01

Aquí está el código que obtuve de un plugin de wordpress

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

Esta es una técnica muy útil para formatear cadenas complejas.

 -5
Author: user1232972,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-15 05:01:53