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?
Citando el manual :
Cuando se especifica una cadena entre comillas dobles o con heredoc, las variables se analizan dentro de ella.
Hay dos tipos de sintaxis: una simple y una compleja . La sintaxis simple es la más común y conveniente. Proporciona una forma de incrustar una variable, un valor de matriz o una propiedad de objeto en una cadena 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 una sintaxis simple parecen ser un error , lo que hace que su primer código no sea válido. La sintaxis compleja parece 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] }"; Obtiene 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 la sintaxis PHP real para las variables sin la horrible trampa mortal que es la interpolación de cadenas.
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 (eg: _ ) // 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 probar 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 .
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']);