Sintaxis de interpolación de cadenas PHP

3 minutos de lectura

avatar de usuario
pionero2017

Traté de redirigir con esta sintaxis:

header("location: readMore.php?id=$post['post_id']");

Pero no funcionó. Funcionó solo después de que alguien sugirió poner corchetes alrededor $post['post_id']!

La sintaxis correcta es:

header("location: readMore.php?id={$post['post_id']}");

¿Qué hacen los corchetes en este caso?

  • ¿Has probado a concatenar así? header( "location: readMore.php?id=" . $post[ 'post_id' ] );

    – JSLirola

    16 de abril de 2017 a las 12:22

  • no, pero lo intenté ahora y funciona. Pero nuevamente, ¿por qué mi sintaxis no funcionó y estas 2 sintaxis funcionan?

    – Pionero2017

    16 de abril de 2017 a las 12:26

avatar de usuario
Siguza

citando el manual:

Cuando un cuerda se especifica entre comillas dobles o con heredoc, Variables se analizan dentro de él.

Hay dos tipos de sintaxis: una sencillo uno y un complejo uno. La sintaxis simple es la más común y conveniente. Proporciona una forma de incrustar una variable, una formación valor, o un objeto propiedad en un cuerda con un mínimo de esfuerzo.

La sintaxis compleja se puede reconocer por las llaves que rodean la expresión.

Su primer código usa una sintaxis simple y su segundo código usa una compleja.

El manual no establece esto explícitamente, pero los espacios en blanco en sintaxis simple parece ser un error, haciendo que su primer código no sea válido. sintaxis compleja aparece para admitir la misma sintaxis que PHP normal, por lo que puedo ver, pero nuevamente, esto no parece estar garantizado en ninguna parte.

La interpolación de cadenas es bastante torpe en general:

$a = [['derp']];
$b = $a[0];

// Works. It prints derp
echo "$b[0]";

// Doesn't work. It throws an error
echo "$b[ 0 ]";

// Works. It prints derp
echo "{$b[ 0 ]}";

// Doesn't work. It prints Array[0]
echo "$a[0][0]";

// Works. It prints derp
echo "{$a[0][0]}";

// Doesn't work. It prints { Array[0] }
echo "{ $a[0][0] }";

Tienes problemas similares con $object -> foo y $object->foo->bar.

Para mí, eso es pura locura. Por esa razón, he llegado a evitar las cadenas entre comillas dobles siempre que sea posible (lo único para lo que las usé fue para secuencias de escape como "\n"). En su lugar, uso comillas simples y concatenación de cadenas, así:

header( 'location: readMore.php?id=' . $post[ 'post_id' ] );

Esto le permite usar actual Sintaxis de PHP para variables sin la horrible trampa mortal que es la interpolación de cadenas.

  • La interpolación de cadenas, como todas las características del lenguaje, es muy útil si no se abusa de ella. Tomaré una larga cadena interpolada sobre un montón de comillas y puntos desagradables cualquier día.

    – Capitán Hipertexto

    1 de agosto de 2019 a las 19:46


  • Todo habría funcionado bien si decidieran permitir solo una sintaxis única. Por ejemplo, este se rompe: $amount = 500; $str = "I have ${$amount} dollars"

    – Fuego

    24 de diciembre de 2019 a las 0:58

  • Esta respuesta dice que al menos tres veces esa interpolación es mala, pero nunca da una razón. Obviamente, los espacios en blanco (o cualquier carácter) donde no pertenezcan causarían errores. Ese no es un ejemplo de que una característica del idioma sea mala, es un ejemplo de que usted pone caracteres donde no pertenecen. Si pusiera espacios en medio de variables regulares no interpoladas, también se romperían.

    – compañero

    27 de diciembre de 2019 a las 5:09


  • @felwithe Diste una justificación de por qué es así, pero eso no lo hace menos malo. Y tampoco digo que podría haberlo construido mejor, pero eso no significa que sea razonable.

    – Siguza

    31 de diciembre de 2019 a las 12:54


  • @Siguza: la eliminación de esa primera oración pareció marcar la diferencia. La forma en que leí la respuesta antes debe haber estado muy influenciada por esa declaración, porque ahora no estoy seguro de por qué estaba tan molesto. ¡Lo siento!

    – Nerdmaster

    13 mayo 2020 a las 15:16

avatar de usuario
pie del brazo

Llegué a esta pregunta para saber más sobre la sintaxis de interpolación constante cuando esas cosas de PHP “<<<" se usan para crear cadenas de varias líneas llamadas Heredocs (que permiten la interpolación de variables, a diferencia de Nowdocs).

Sin embargo, parece que no hay una sintaxis específica para ellos y, por lo tanto, una solución sencilla es crear un cierre para hacerlo. Aquí es solo una función anónima asignada a una variable que se invocará con parámetros:

$int="intruder";        // Variable
define('con', '"smart"'); // Constant
// For complex interpolation:
// 1. Define a closure (anonymous function)
// 2. Assign it to a variable with a short name (e.g.: _ )
// 3. Invoke the function by calling the variable with parameters enclosed in ()
$_ = function ($val){return $val;};

$doc = <<<TXT
Hi there,
One day I caught this $int nearby.
I was then told that actually other {$_(con)} $int was there before.
So who came first, the chicken or the egg?
TXT;                      // Heredoc
echo $doc;

Producción:

Hola,

Un día atrapé a este intruso cerca.

Luego me dijeron que en realidad había otro intruso “inteligente” allí antes.

Entonces, ¿quién fue primero, el huevo o la gallina?

Puede prueba lo anterior en línea en 3v4l. Esto se basó en esta respuesta con algunos ejemplos más con operaciones dentro de los corchetes de interpolación.

  • Inteligente. ¡He verificado que la misma técnica funciona dentro de una cadena entre comillas dobles!

    – El fabricante de herramientas Steve

    22 de diciembre de 2020 a las 1:20

avatar de usuario
Oen44

Los corchetes permiten que PHP lea lo que hay dentro como una variable. También puedes hacerlo de esta manera:

header("location: readMore.php?id=" . $post['post_id']);

avatar de usuario
Anuj Tiwary

Cuando usa comillas dobles o simples, PHP tratará todo lo que contiene como una cadena a menos que le diga que es una variable. PHP entiende cualquier cosa después { seguido por $ como una variable y la trata como tal. Aquí hay un ejemplo:

$Text = "XYz";
echo "name-{$Text}";

El otro método alternativo es utilizar la concatenación. Aquí hay un ejemplo:

header("location: readMore.php?id=" . $post['post_id']);

avatar de usuario
esbelto

PHP sencillo la interpolación de cadenas no reconoce las claves de matriz entre comillas, lo que su ejemplo demuestra perfectamente. De hecho, la forma correcta de escribir esto es exactamente opuesta dependiendo de la sintaxis utilizada: sencillo contra complejo.

Sintaxis simple: incorrecta

Las claves entre comillas no se pueden analizar.

header("location: readMore.php?id=$post['post_id']");

Sintaxis simple – Derecha

La cadena sin comillas es la clave de matriz asociativa.

header("location: readMore.php?id=$post[post_id]");

Sintaxis compleja: incorrecta

Funcionará, pero sólo si post_id es una constante definida. Si no, recibirá una advertencia de PHP.

header("location: readMore.php?id={$post[post_id]}");

Sintaxis compleja – Derecha

Escrito como fuera de la cadena.

header("location: readMore.php?id={$post['post_id']}");

Para citar el manual sobre el sintaxis compleja:

// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";

Recomendaría usar una sintaxis compleja (llaves) si usa claves entre comillas. Y realmente debería usarlos, porque fuera de la interpolación de cadenas, las claves sin comillas son en realidad constantes. Es una lástima que la sintaxis simple no los permita, porque hace que las revisiones de código y la actualización del código PHP antiguo sean más difíciles.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad