2010-09-04 11 views
9

Algunas búsquedas en Google (y en mi propia experiencia) muestran que en PHP no se puede obtener un elemento de matriz cuando se devuelve desde una llamada de función en la misma línea. Por ejemplo, no se puede hacer:Acceder a un elemento de matriz al regresar de una función

echo getArray()[0]; 

Sin embargo, me he encontrado con un pequeño truco:

echo ${!${false}=getArray()}[0]; 

En realidad funciona. El problema es que no sé por qué funciona. Si alguien pudiera explicarlo, sería genial.

Gracias.

+1

definitivamente no ** ** no hacer que el código sea más legible;) –

Respuesta

10
echo ${!${false}=getArray()}[0]; 

Ésta es la forma en que funciona, paso a paso

${false}=getArray() 

asigna el resultado de getArray a una variable con un nombre vacío ('' o null funcionaría en lugar de falso)

!${false}=getArray() 

niega el valor anterior, convirtiéndose a booleano falso

${!${false}=getArray()} 

convierte el valor anterior (falso) para una cadena (vacío) y utiliza esta cadena como un nombre de variable. Es decir, esta es la variable del paso 1, igual al resultado de getArray.

${!${false}=getArray()}[0]; 

toma el índice de esa variable "vacía" y devuelve un elemento de matriz.

Algunos más variaciones de la misma idea

echo ${1|${1}=getArray()}[1]; 
echo ${''.$Array=getArray()}[1]; 

function p(&$a, $b) { $a = $b; return '_'; } 
echo ${p($_, getArray())}[1]; 

cuanto a por qué getArray()[0] no funciona, esto es porque el equipo de PHP no tiene ni idea de cómo conseguir que funcione.

+0

perfecto, gracias. – Daniel

+0

excelentes ejemplos, muy informativos +1 – RobertPitt

3

funciona porque usa las llaves para convertir el valor en un varialbe, he aquí un ejemplo.

Por qué es esto necesario, esto es necesario ENCASE desea convertir una cadena o valor devuelto en una variable, ejemplo

${$_GET['var']} = true; 

Esta es una mala práctica y nunca se debe utilizar la OMI.

se debe utilizar objetos si desea ejecutar directamente de funciones, ejemplo

function test() 
{ 
    $object = new stdClass(); 
    $object->name = 'Robert'; 

    return $object; 
} 
echo test()->name; 
2

Cabe señalar que puede hacer esto a partir de PHP 5.4. Desde el manual sobre desreferenciación de matrices:

A partir de PHP 5.4, es posible ordenar la desreferencia el resultado de una llamada a una función o método directamente. Antes solo era posible usar una variable temporal.

Ejemplo:

function theArray() { 
    return range(1, 10); 
} 

echo theArray()[0]; 
// PHP 5.4+: 1 
// PHP -5.4: null 

Pre PHP 5.4: El intento de acceder a una clave de la matriz que no ha sido definida es la misma que el acceso a cualquier otra variable no definida: un mensaje de error de nivel E_NOTICE será emitido, y el resultado será NULL.

Manual:

Cuestiones relacionadas