2011-02-03 8 views
17
for($i=0; $i<3; $i++) { 
    echo '$i = ' . $i . '<br/>' ; 
} 
echo 'out of loop, $i = ' . $i; 

le uscite di cui sopra:Perché PHP NON cancella la memoria dopo aver lasciato i loop?

$i = 0 
$i = 1 
$i = 2 
out of loop, $i = 3 

Non ha senso per me che $ i è ancora visibile anche dopo la visualizzazione di fuori del campo di applicazione del ciclo. Perché ciò accade (in Java viene automaticamente raccolto dalla garbage collection)?

E c'è un modo per dire php a automaticamente fare garbage-collection dopo aver superato l'ambito del ciclo? Il mio codice sembra brutto quando devo chiamare unset() dopo ogni ciclo.

+9

è una funzionalità. – Arvin

+20

PHP non è java –

+0

@Mark Sì, è meglio di così, non è richiesto gc, http://us2.php.net/manual/en/language.variables.scope.php –

risposta

42

Non si tratta di garbage collection, ma di ambito.

In PHP, i loop non creano il proprio ambito. $i viene creato nello stesso ambito del ciclo, quindi esiste ancora una volta terminato il ciclo. Non sarà raccolto niente più di una variabile che dichiari sulla linea prima che il ciclo sia.

Consideralo come una funzione, poiché viene spesso utilizzato come tale. Ad esempio, non devi dichiarare il tuo contatore di loop prima del ciclo per sapere qual è il suo valore dopo aver interrotto il ciclo.

Se si esegue manualmente la variabile unset, è possibile forzare la garbage collection con gc_collect_cycles come da PHP 5.3.

+0

Solo un'aggiunta: _Every_ variable outside a method/la funzione è globale. Ciò significa in particolare che tu (@evilReiko) non devi "disinserire()" le tue variabili, se fai un loop all'interno di un metodo/funzione. – KingCrunch

+2

Vorrei notare che in un banale esempio come questo (e, in effetti, nel 99,999% dei casi), la chiamata al GC non è necessaria o addirittura raccomandata. Forse se stai lavorando con enormi strutture di dati all'inizio della tua vita di script, ma anche in questo caso, probabilmente è meglio se non lo fai. – fwielstra

8

Da Variable scope

L'ambito di una variabile è il contesto in cui è definita. Per la maggior parte tutte le variabili PHP hanno un solo ambito. Questo singolo ambito comprende anche i file richiesti. [...] All'interno delle funzioni definite dall'utente viene introdotto un ambito di funzione locale. Qualsiasi variabile utilizzata all'interno di una funzione è limitata di default all'ambito della funzione locale.

La variabile non sarà raccolta dati inutili perché è ancora presente un riferimento a $i nell'ambito dopo aver lasciato il ciclo. Si noti che l'utilizzo di unset non comporterà alcuna procedura di Garbage Collection, ma segnerà solo la memoria non più referenziata per lo Garbage Collector da raccogliere alla successiva esecuzione del GC. È possibile forzare la garbage collection con gc_collect_cycles.

4

se si utilizza una funzione ricorsiva per sostituire il ciclo, le variabili di sinistra devono essere cancellate.

basta inserire il ciclo in un'altra funzione qualsiasi dovrebbe essere in un ambito diverso, basta passare i dati dentro e fuori di esso.

+0

soluzione interessante! – evilReiko

Problemi correlati