2011-01-19 15 views
36

Cuando la interpolación de elementos de PHP cadena indexados array (5.3.3, Win32) se puede esperar el siguiente comportamiento o no:de interpolación (citada cadena doble) de asociativos matrices en PHP

$ha = array('key1' => 'Hello to me'); 

print $ha['key1']; # correct (usual way) 
print $ha[key1];  # Warning, works (use of undefined constant) 

print "He said {$ha['key1']}"; # correct (usual way) 
print "He said {$ha[key1]}"; # Warning, works (use of undefined constant) 

print "He said $ha['key1']"; # Error, unexpected T_ENCAPSED_AND_WHITESPACE 
print "He said $ha[ key1 ]"; # Error, unexpected T_ENCAPSED_AND_WHITESPACE 
print "He said $ha[key1]";  # !! correct (How Comes?) 

Inerestingly, la La última línea parece ser el código PHP correcto. Alguna explicacion? ¿Se puede confiar en esta característica?


Editar: El punto de la publicación ahora establecido en negrita con el fin de reducir los malos entendidos.

Respuesta

38

Sí, puede confiar en él. All ways of interpolation a variable are covered in the documentation bastante bien.

Si quiere tener una razón por la que esto se hizo así, bueno, no puedo ayudarlo allí. Pero como siempre: PHP es viejo y ha evolucionado mucho, introduciendo una sintaxis inconsistente.

+0

@nikic, no puedo encontrar este caso exacta (w/o llaves) en la documentación, ¿dónde está ? Gracias, rbo –

+0

@mario: Personalmente creo que no es bueno, pero probablemente muchos otros están de acuerdo con eso -> Se cayó esa parte. – NikiC

+0

@rubber botas: busque esta línea: 'echo" Bebió un poco de jugo de $ jugos [koolaid1] ". PHP_EOL;'. – NikiC

8

El último es un caso especial manejado por el tokenizador de PHP. No busca si se definió alguna constante con ese nombre, siempre asume un literal de cadena para compatibilidad con PHP3 y PHP4.

+4

Solo para aquellos interesados ​​(probablemente nadie ...): PHP generará un 'T_STRING' para el índice de matriz (o un' T_NUM_STRING' si es un número decimal no desbordado) en lugar del 'T_CONSTANT_ENCAPSED_STRING' normal. – NikiC

9

Sí, este es un comportamiento bien definido, y siempre buscará la clave de cadena 'key', y no el valor de la constante (potencialmente indefinida) key.

Por ejemplo, considere el siguiente código:

$arr = array('key' => 'val'); 
define('key', 'defined constant'); 
echo "\$arr[key] within string is: $arr[key]"; 

Esta es la salida siguiente:

$arr[key] within string is: val 

Dicho esto, es probable que no las mejores prácticas para escribir código como este, y en su lugar ya sea para uso :

$string = "foo {$arr['key']}" 

o

$string = 'foo ' . $arr['key'] 

sintaxis.

0

Para responder a su pregunta, sí, sí se puede, y al igual que implosionan y explotar, PHP es muy muy indulgente ... así que abundan inconsistencia

Y tengo que decir que me gusta la interpolación de PHP para la perforación margarita basical variables en cadenas en ese momento,

Sin embargo, si solo hace una interpolación de variables de cadena usando objetos de una sola matriz, puede ser más fácil escribir una plantilla en la que pueda imprimir variables de objetos específicos (como en javascript o python) y, por tanto, el control explícito sobre el alcance de la variable y el objeto que se aplica a la cadena

I aunque isprintf de este tipo realmente útil para este tipo de cosas

http://www.frenck.nl/2013/06/string-interpolation-in-php.html

<?php 

$values = array(
    'who' => 'me honey and me', 
    'where' => 'Underneath the mango tree', 
    'what' => 'moon', 
); 

echo isprintf('%(where)s, %(who)s can watch for the %(what)s', $values); 

// Outputs: Underneath the mango tree, me honey and me can watch for the moon 
+1

El enlace informa un error 404 – fpierrat