Llaves en cadena en PHP

Respuestas:

281

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 o propiedad de objeto con una representación de cadena se puede incluir a través de esta sintaxis. Simplemente escriba la expresión de la misma manera que aparecería fuera de la cadena, y luego envuélvala en {y }. Dado que {no se puede escapar, esta sintaxis será reconocida únicamente cuando la $sigue inmediatamente al {. Use {\$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:

$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 una variable nombrada $aefgh, por lo que debe hacer lo siguiente:

$out = "${a}efgh"; // or
$out = "{$a}efgh";
cletus
fuente
40
demasiadas críticas anal sobre copiar / pegar. Si lo hace fácil de entender / encontrar, entonces fue una buena decisión. +1 de mí, era exactamente lo que estaba buscando, y no lo encontré en el manual de PHP, tal vez porque lo llaman por el nombre correcto, o lo que sea. Pero lo encontré aquí.
Gabriel Magana
9
Para curvas literales, duplíquelas, por ejemplo $vars='x:3,y:9'; $json="{{$vars}}";. Gracias al artículo de QiGuang .
Bob Stein
... O $out = '$aefgh'; (si necesita literalmente $ aefgh)
Roko C. Buljan
Un ejemplo de caso de uso interesante es SimpleXMLElement: {}se usa para acceder al nodo en sí, por ejemplo $element[0]->{0}. Como la propiedad "0" no puede existir, esto activará __get/ __setmétodo. En esencia, esto le permite una alternativa ArrayAccesspara el acceso al índice, por ejemplo, 3v4l.org/1F254 .
Gajus
2
Si un contenido dentro de llaves literal también contiene variables, entonces agregue llaves a cada variable: $min=1;$max=5; echo ".{{$min},{$max}}"rendimientos .{1,5}(tuve problemas para saber dónde "doblar [las llaves]" mencionado en el comentario de @ BobStein)
Xenos
47

En cuanto a mí, las llaves sirven para sustituir 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 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

?>
Kredo900
fuente
1
"PHP analiza su contenido" - Esto es engañoso. No puede simplemente poner expresiones PHP arbitrarias dentro de la sintaxis de llaves, que es lo que leí que significa su cita.
Mark Amery
1
En mi opinión, en general, no es más rápido escribir con corchetes. Usted tiene que SHIFTpulsar una tecla para las comillas dobles y de las llaves. Sin embargo, sería más rápido si usa estrictamente comillas dobles.
deflime
2
Gracias por resaltar comillas dobles v comillas simples, +1
cameronjonesweb
Yo usaría en evaluatelugar deparse
Cholthi Paul Ttiopic
17

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.

Obiware
fuente
3

También me pareció útil acceder a los atributos de los objetos donde los nombres de los atributos varían según algún iterador. Por ejemplo, he usado 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 los métodos de clase. Simplemente construya el nombre del método de la misma manera, usando cadenas y variables de cadena.

Podría argumentar fácilmente que solo use una matriz para el almacenamiento de valor por período. Si esta aplicación fuera solo PHP, estaría de acuerdo. Uso 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 utilizando la serialización, es ineficiente y no tiene sentido si los campos individuales deben indexarse. A menudo agrego una matriz de nombres de campo, marcados por el 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,
        );
    }
}
Ray N. Franklin
fuente
-5

Aquí está el código que obtuve de un complemento de WordPress

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

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

usuario1232972
fuente