O ile wiem (a to bardzo mało), istnieją dwa sposoby:
$var = new object()
Następnie:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
Inna lepsza metoda? Czy ja tu rozdzielam włosy?
O ile wiem (a to bardzo mało), istnieją dwa sposoby:
$var = new object()
Następnie:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
Inna lepsza metoda? Czy ja tu rozdzielam włosy?
Odpowiedzi:
Szukasz unset()
.
Ale weź pod uwagę, że nie możesz jawnie zniszczyć obiektu.
Pozostanie tam, jednak jeśli wyłączysz obiekt, a skrypt wypchnie PHP do limitu pamięci, niepotrzebne obiekty zostaną usunięte. Poszedłbym z unset()
(w przeciwieństwie do ustawiania go na null), ponieważ wydaje się, że ma lepszą wydajność (nie testowany, ale udokumentowany w jednym z komentarzy w oficjalnej instrukcji PHP).
To powiedziawszy, należy pamiętać, że PHP zawsze niszczy obiekty, gdy tylko strona jest wyświetlana. Więc powinno to być potrzebne tylko w przypadku naprawdę długich pętli i / lub bardzo intensywnych stron.
unset()
usuwa odniesienie do obiektu?
Poręczny post wyjaśniający kilka nieporozumień na ten temat:
Obejmuje to kilka nieporozumień dotyczących działania destruktora. Wyraźne wywołanie go nie zniszczy twojej zmiennej, zgodnie z dokumentacją PHP5:
PHP 5 wprowadza koncepcję destruktora podobną do koncepcji innych języków zorientowanych obiektowo, takich jak C ++. Metoda destruktora zostanie wywołana, gdy nie będzie żadnych innych odwołań do określonego obiektu lub w dowolnej kolejności podczas sekwencji zamykania.
Powyższy post stwierdza, że ustawienie zmiennej na null może działać w niektórych przypadkach, o ile nic innego nie wskazuje na przydzieloną pamięć.
Krótka odpowiedź: potrzebne są oba.
Wydaje mi się, że podano właściwą odpowiedź, ale minimalną. Tak, generalnie unset () jest najlepsze dla „szybkości”, ale jeśli chcesz natychmiast odzyskać pamięć (kosztem procesora), powinieneś użyć null.
Podobnie jak inni wspomnieli, ustawienie na null nie oznacza, że wszystko jest odzyskane, możesz mieć obiekty pamięci współdzielonej (niesklonowane), które zapobiegną zniszczeniu obiektu. Co więcej, jak powiedzieli inni, i tak nie możesz „niszczyć” obiektów w sposób jawny, więc i tak nie powinieneś próbować tego robić.
Musisz dowiedzieć się, który z nich jest dla Ciebie najlepszy. Możesz także użyć __destruct () dla obiektu, który będzie wywoływany w stanie nieustawionym lub zerowym, ale powinien być używany ostrożnie i, jak powiedzieli inni, nigdy nie powinien być wywoływany bezpośrednio!
widzieć:
http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/
Jaka jest różnica między przypisywaniem wartości NULL i unset?
To prosty dowód na to, że nie możesz zniszczyć obiektu, możesz tylko zniszczyć łącze do niego.
$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;
zwroty
2
Zobacz to w akcji tutaj: https://eval.in/1054130
$var2
czego było odniesienie $var
. Teraz również niszczysz $var
i zakładając, że na obiekcie nie ma innych odniesień, gotowe.
Może być w sytuacji, gdy tworzysz nowy obiekt mysqli.
$MyConnection = new mysqli($hn, $un, $pw, $db);
ale nawet po zamknięciu obiektu
$MyConnection->close();
jeśli użyjesz print_r()
do sprawdzenia zawartości $MyConnection
, pojawi się błąd jak poniżej:
Error:
mysqli Object
Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)
w takim przypadku nie możesz użyć, unlink()
ponieważ unlink()
będzie wymagać ciągu nazwy ścieżki, ale w tym przypadku $MyConnection
jest to Object.
Masz więc inny wybór ustawienia jego wartości na null:
$MyConnection = null;
teraz wszystko idzie dobrze, jak się spodziewałeś. Nie masz żadnej zawartości wewnątrz zmiennej, $MyConnection
a także wyczyściłeś obiekt mysqli.
Zalecaną praktyką jest zamykanie Object przed ustawieniem wartości zmiennej na null
.
Poszedłbym bez ustawienia, ponieważ może to dać odśmiecaczowi lepszą wskazówkę, aby pamięć mogła być ponownie dostępna wcześniej. Uważaj, aby wszystko, co wskazuje obiekt, albo miało inne odwołania, albo zostało najpierw rozbrojone, albo naprawdę będziesz musiał poczekać na moduł odśmiecania pamięci, ponieważ wtedy nie będzie do nich dojść.
new
raz, to musi wykorzystaćdelete
tylko raz. To nie jest prawda w PHP? Czy istnieje automatyczne usuwanie elementów bezużytecznych, gdy obiekt nie jest już potrzebny?