2015-12-04 19 views
9

foreach in PHP7 per impostazione predefinita, quando l'iterazione in valore, opera su una copia della matrice secondo: http://php.net/manual/en/migration70.incompatible.phpcambiamenti foreach in PHP7

Ha pigramente creare una copia solo se vi sono modifiche apportate alla matrice o un valore o produrrà sempre una copia e in pratica farà riferimento al looping su un ottimizzazione delle prestazioni?

Inoltre, le matrici di oggetti continuano a loop/danno riferimenti agli oggetti? Oppure creeranno anche copie per lo foreach e restituiranno gli oggetti in base al valore?

+0

Secondo [la risposta più importante qui] (http://stackoverflow.com/questions/10057671/how-does-foreach-actually-work?rq=1) c'è anche una copia eseguita in PHP5 durante l'iterazione in base al valore. – Kenney

+2

Suggerimento: basta eseguire l'iterazione e non cercare di ottimizzare "scrivendo codice efficiente". La maggior parte del tempo usa solo i costrutti e permette loro di capire come eseguire il codice. Solo se si misura che le prestazioni non sono accettabili, si desidera apportare una modifica. (Non è una risposta o un downvote perché c'è una ragione accademica per porre la domanda, ma vale la pena affermarlo) – ircmaxell

+0

@ircmaxell questo potrebbe essere formulato più brevemente: http://stackoverflow.com/questions/385506/when-is-optimisation- precoce –

risposta

12

In PHP 7, se si itera un array in base al valore, la copia verrà eseguita pigramente, solo quando e se la matrice viene effettivamente modificata.

Se si esegue iterazione di un array per riferimento, verrà eseguita una separazione all'inizio del ciclo. Se la matrice è attualmente utilizzata in più di un posto, questa separazione porterà a una copia.

Inoltre, l'iterazione mediante riferimento indica che a) la matrice deve essere racchiusa in un riferimento eb) ogni elemento deve essere avvolto in un riferimento. La creazione di un wrapper di riferimento è un'operazione costosa, poiché richiede allocazione.

L'iterazione per riferimento richiede inoltre l'utilizzo di un meccanismo di modifica sicura delle modifiche. Ciò funziona registrando l'iteratore con l'array e controllando gli iteratori potenzialmente interessati in varie operazioni di modifica dell'array.

Quindi no, l'iterazione per riferimento non è certamente un'ottimizzazione, è una de-ottimizzazione. L'uso dei riferimenti è di solito.