Per quanto ne so (che è molto poco), ci sono due modi, dato:
$var = new object()
Poi:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
Altro metodo migliore? Sto spaccando i capelli qui?
Per quanto ne so (che è molto poco), ci sono due modi, dato:
$var = new object()
Poi:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
Altro metodo migliore? Sto spaccando i capelli qui?
Risposte:
Stai cercando unset()
.
Ma tieni presente che non puoi distruggere esplicitamente un oggetto.
Rimarrà lì, tuttavia se disattivi l'oggetto e il tuo script spinge PHP ai limiti di memoria, gli oggetti non necessari verranno raccolti in modo spazzatura. Vorrei andare con unset()
(invece di impostarlo su null) in quanto sembra avere prestazioni migliori (non testato ma documentato su uno dei commenti dal manuale ufficiale di PHP).
Detto questo, tieni presente che PHP distrugge sempre gli oggetti non appena viene pubblicata la pagina. Quindi questo dovrebbe essere necessario solo su loop molto lunghi e / o pagine ad alta intensità.
unset()
elimina il riferimento all'oggetto?
Un post utile che spiega diversi malintesi su questo:
Non chiamare esplicitamente il distruttore
Questo copre diverse idee sbagliate su come funziona il distruttore. Chiamarlo esplicitamente non distruggerà effettivamente la tua variabile, secondo il documento PHP5:
PHP 5 introduce un concetto di distruttore simile a quello di altri linguaggi orientati agli oggetti, come C ++. Il metodo distruttore verrà chiamato non appena non ci sono altri riferimenti a un particolare oggetto, o in qualsiasi ordine durante la sequenza di spegnimento.
Il post sopra afferma che l'impostazione della variabile su null può funzionare in alcuni casi, purché nient'altro punti alla memoria allocata.
Risposta breve: sono necessari entrambi.
Penso che sia stata data la risposta giusta, ma in minima parte. Sì, generalmente unset () è il migliore per "velocità", ma se vuoi recuperare immediatamente la memoria (al costo della CPU) dovresti usare null.
Come altri menzionati, l'impostazione su null non significa che tutto sia stato recuperato, puoi avere oggetti di memoria condivisa (non clonati) che impediranno la distruzione dell'oggetto. Inoltre, come altri hanno detto, non puoi comunque "distruggere" gli oggetti esplicitamente, quindi non dovresti provare a farlo comunque.
Dovrai capire qual è il migliore per te. Inoltre puoi usare __destruct () per un oggetto che verrà chiamato su unset o null ma dovrebbe essere usato con attenzione e come altri hanno detto, non essere mai chiamato direttamente!
vedere:
http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/
Questa è una semplice prova che non puoi distruggere un oggetto, puoi solo distruggere un collegamento ad esso.
$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;
ritorna
2
Guardalo in azione qui: https://eval.in/1054130
$var2
che era un riferimento $var
. Ora distruggi anche tu $var
e, presumendo che non ci siano altri riferimenti sull'oggetto, hai finito.
Potrebbe trovarsi in una situazione in cui stai creando un nuovo oggetto mysqli.
$MyConnection = new mysqli($hn, $un, $pw, $db);
ma anche dopo aver chiuso l'oggetto
$MyConnection->close();
se utilizzerai print_r()
per controllare il contenuto di $MyConnection
, otterrai un errore come di seguito:
Error:
mysqli Object
Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)
in tal caso non è possibile utilizzarlo unlink()
perché unlink()
richiederà una stringa del nome del percorso ma in questo caso $MyConnection
è un oggetto.
Quindi hai un'altra scelta di impostare il suo valore su null:
$MyConnection = null;
ora le cose vanno bene, come ti aspettavi. Non hai alcun contenuto all'interno della variabile$MyConnection
e hai già ripulito l'oggetto mysqli.
È consigliabile chiudere l'oggetto prima di impostare il valore della variabile su null
.
Vorrei andare con unset perché potrebbe dare al garbage collector un suggerimento migliore in modo che la memoria possa essere nuovamente disponibile prima. Fai attenzione che qualsiasi cosa a cui l'oggetto punta abbia altri riferimenti o venga prima disattivata o dovrai davvero aspettare il garbage collector poiché non ci sarebbero quindi handle per loro.
new
una volta, dobbiamo usaredelete
una volta. Questo non è vero in PHP? C'è la garbage collection automatica quando l'oggetto non è più necessario?