PHP utilizza un meccanismo chiamato copy-on-write per evitare esattamente la copia eccessivo di variabili fino a quando è necessario farlo. Quindi anche nel tuo esempio test2()
non viene copiato lo $array
. Se avessi modificato $array
all'interno della funzione, PHP avrebbe copiato la variabile per consentire la modifica. Una spiegazione dettagliata di questo meccanismo è disponibile nel capitolo "Memory Management" di "PHP Internals Book". La seguente citazione è dalla sezione "Reference-counting and copy-on-write":
Se si pensa al sopra per un po ', si arriva alla conclusione che PHP deve fare un sacco di copia. Ogni volta che si passa a qualcosa in una funzione, è necessario copiare il valore. Questo potrebbe non essere particolarmente problematico per un intero o un doppio, ma immagina passando un array con dieci milioni di elementi a una funzione. La copia di milioni di elementi per ogni chiamata sarebbe proibitivamente lenta.
Per evitare di farlo, PHP impiega il paradigma copy-on-write: Uno zval può essere condiviso da più variabili/funzioni/etc finché è solo leggere e non modificati. Se uno dei titolari vuole modificarlo, , lo zval deve essere copiato prima di applicare qualsiasi modifica.
I seguenti due articoli prevedono anche più comprensione di questo argomento (entrambi scritti da sviluppatori di core di PHP):
Il il primo spiega anche perché l'utilizzo di riferimenti solo per motivi di prestazioni è spesso una cattiva idea:
Un altro motivo per cui le persone utilizzano il riferimento è dato dal fatto che ritengono di rendere più veloce il codice . Ma questo è sbagliato. È anche peggio: i riferimenti per lo più rendono il codice più lento!
Sì, i riferimenti spesso rallentano il codice: mi spiace, ho dovuto solo ripetere lo per chiarire.
E il secondo mostra perché gli oggetti non vengono realmente passati per riferimento in PHP5 +.
fonte
2015-12-29 10:31:08
- Perché dovrebbe? –
@u_mulder, per evitare di copiare l'intero array e consumare meno memoria – marsgpl
L'array verrà copiato quando è necessario farlo. –