2012-12-31 13 views
5

extract(some_function_that_returns_array());Perché extract() funziona con le funzioni?

funziona correttamente.

Ma su php.net si dice che il primo parametro deve essere una variabile di riferimento: http://php.net/manual/en/function.extract.php. È un errore?


così

function foo(&$array){} 

function lol(){ $arr = array(); return $arr; } 

foo(lol()); 

mostra "severe normative: Solo le variabili devono essere passati per riferimento in ..."

che non accade con l'estratto

+0

Si prega di considerare questo un bug e segnalarlo. Un bug correlato potrebbe essere: https://bugs.php.net/bug.php?id=55222 Una domanda correlata potrebbe essere: http://stackoverflow.com/q/6726589/367456 – hakre

+0

beh, in realtà non mi interessa a questo proposito, ma mostra che il manuale non può essere considerato attendibile: P cosa succede se 'die()' ci uccide invece della sceneggiatura? :( – thelolcat

+0

lolcatly, prenditela comoda.Non puoi sempre fidarti dei documenti.Qualunque trusting significhi qui btw, immagino che questo piccolo difetto non ti stia uccidendo, giusto? E se non ti interessa, allora per favore non chiedere – hakre

risposta

1

Sia la documentazione è in errore o la funzione è in errore. Onestamente, non posso per nessun motivo capire perché l'estratto debba essere passato un array per riferimento, ma qualcuno ha indicato il flag di tipo EXTR_REFS.

Guardando la mia versione locale del codice PHP (5.3.2), posso vedere che la definizione della funzione per extract() non indica passaggio per riferimento.

function extract (array $var_array, $extract_type = null, $prefix = null) 

Guardando sort() la definizione Mostrano passaggio per riferimento:

function sort (array &$array, $sort_flags = null) 

Questo è il motivo per cui non ho ricevuto l'errore rigoroso su extract() e lo vedo su sort().

Suppongo che la documentazione su php.net non sia aggiornata o semplicemente errata. extract() è un vecchio cucciolo ... Non sono sicuro che nel lontano giorno la definizione della funzione indicava effettivamente &$var_array oppure no.

L'altra opzione è che la definizione della funzione è incasinata in qualche punto e la documentazione indica correttamente come dovrebbe essere, in base al fatto che esiste un flag di tipo extra di EXTR_REFS potrebbe essere il caso (questa costante esiste ancora).

+1

Questo non è corretto. Solo perché il riferimento pass-by-call è stato deprecato in 5.3 e rimosso in 5.4 non significa che non è più possibile passare vars per riferimento. Completamente estraneo alla domanda dell'OP. – igorw

+0

@igorw questo è corretto. Il passaggio per riferimento è ottenuto dalla definizione della funzione, non specificata quando si chiama la funzione. – Ray

+1

Questa risposta non ha nulla a che fare con la domanda. OP non sta chiedendo del tempo di chiamata affatto. – webbiedave

Problemi correlati