2014-05-18 22 views
5

end(array_keys(array(0))) dice PHP Strict standards: Only variables should be passed by reference (http://3v4l.org/CNLVT)Perché non termina (()) un avviso severo?

end((array_keys(array(0)))) d'altra parte, funziona da solo (http://3v4l.org/168fi). Perché?

Il decompilatore VLD mostra gli stessi opcode in esecuzione l'unica differenza è nella colonna ext ma non riesco a trovare la documentazione su ciò che significa.

+0

C'è un trucco simile in MySQL dove non è possibile aggiornare una tabella a Selezionare dalla stessa tabella ([vedi questa risposta] (http://stackoverflow.com/questions/12475850/how-can-an-sql-query-return-data-from-multiple-tables/12508381 # 12508381) - il secondo bit della risposta) ma ruota attorno a come vengono passati i dati valutati. Attaccare un set extra di parentesi attorno ad esso cambia il modo in cui viene trattato. È qualcosa che riguarda il valore che deriva direttamente da una funzione e che viene trattata come se fosse una propria entità all'interno delle parentesi. – Fluffeh

+0

Heh, @NikiC, stavo proprio per farlo :: D –

risposta

2

È probabile che stia succedendo array_keys per riferimento. Come tale, PHP ti sta facendo notare che non dovresti farlo.

Il raggruppamento tra parentesi modifica effettivamente il riferimento e costringe PHP a valutare prima l'istruzione. In quanto tale, rimuove il riferimento. Una di quelle cose strane che non sembra fare la differenza, ma in realtà lo fa.

Maggiori informazioni sul stranezza qui http://phpsadness.com/sad/51

+0

Quello che ho detto, ma molto meglio, più chiaro e comprensibile :) +1 – Fluffeh

+4

'array_keys' sicuramente non passa il risultato indietro per riferimento e anche l'errore indica l'esatto opposto *. Questa non è la risposta corretta! – chx

+0

@Fluffeh non essere geloso, P – itachi

Problemi correlati