Accedere a un elemento dell'arrays quando si torna da una function

Alcune ricerche su Google (e sulla mia esperienza personale) mostrano che in PHP non è ansible afferrare un elemento dell'arrays quando è stato restituito da una chiamata di function sulla stessa linea. Ad esempio, non puoi fare:

echo getArray()[0]; 

Tuttavia, mi sono imbattuto in un piccolo trucchetto:

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

Funziona davvero. Il problema è che non so perché funzioni. Se qualcuno potesse spiegare, sarebbe fantastico.

Grazie.

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

Ecco come funziona, passo dopo passo

 ${false}=getArray() 

assegna il risultato di getArray a una variabile con un nome vuoto ('' o null functionrebbe invece di falso)

 !${false}=getArray() 

nega il valore precedente, trasformandolo in boolean falso

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

converte il precedente valore (falso) in una string (vuota) e utilizza questa string come nome di variabile. Cioè, questa è la variabile del passo 1, uguale al risultato di getArray.

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

prende l'indice di quella variabile "vuota" e restituisce un elemento dell'arrays.

Altre varianti della stessa idea

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

Il motivo per cui getArray()[0] non funziona, questo perché il team php non ha idea di come farlo funzionare.

funziona perché si utilizzano le parentesi per trasformare il valore in un varialbe, ecco un esempio.

 $hello = 'test'; echo ${"hello"}; 

Perché è necessario, questo è necessario perché tu voglia trasformare una string o il valore restituito in una variabile, ad esempio

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

Questa è una ctriggers pratica e non dovrebbe mai essere usata IMO.

dovresti usare gli Oggetti se desideri eseguire direttamente le funzioni, ad esempio

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

Va notato che puoi farlo a partire da PHP 5.4. Dal manuale sulla dereferenziazione di arrays:

A partire da PHP 5.4 è ansible assegnare alla dereferenziazione il risultato di una function o di una chiamata di metodo direttamente. Prima era ansible solo usando una variabile temporanea.

Esempio:

 function theArray() { return range(1, 10); } echo theArray()[0]; // PHP 5.4+: 1 // PHP -5.4: null 

Pre PHP 5.4: il tentativo di accedere a una chiave di arrays che non è stata definita è uguale all'accesso a qualsiasi altra variabile non definita: verrà emesso un messaggio di errore di livello E_NOTICE e il risultato sarà NULL.

Manuale: