물체를 어떻게 파괴합니까?
내가 아는 한(매우 적은) 두 가지 방법이 있습니다.
$var = new object()
그 후, 다음과 같이 입력합니다.
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
다른 더 좋은 방법?나 지금 머리 갈라져?
를 찾고 있습니다.
그러나 명시적으로 물체를 파괴할 수는 없다는 점을 고려하십시오.
그러나 오브젝트의 설정을 해제하고 스크립트가 PHP를 메모리 제한까지 푸시하면 불필요한 오브젝트가 수집됩니다.같이 가고 싶다unset()
(null로 설정하는 것과는 달리) 퍼포먼스가 더 좋은 것 같습니다(테스트는 하지 않았지만 PHP 공식 매뉴얼에 있는 코멘트 중 하나에 기재되어 있습니다.
단, PHP는 항상 페이지가 제공되자마자 오브젝트를 파괴한다는 점에 유의하시기 바랍니다.따라서 이 기능은 매우 긴 루프 및/또는 무거운 부하가 높은 페이지에만 필요합니다.
이에 대한 몇 가지 오해를 설명하는 유용한 게시물:
이것은 파괴자의 작동 방식에 대한 몇 가지 오해를 다루고 있습니다.PHP5 문서에 따르면 명시적으로 호출해도 실제로 변수가 파괴되지는 않습니다.
PHP 5는 C++와 같은 다른 객체 지향 언어와 유사한 소멸자 개념을 도입합니다.디스트럭터 메서드는 특정 오브젝트에 대한 다른 참조가 없는 즉시 또는 셧다운 시퀀스 중에 임의의 순서로 호출됩니다.
위의 게시물에는 할당된 메모리를 가리키는 것이 없는 한 변수를 null로 설정하는 것이 동작할 수 있다고 기재되어 있습니다.
간단한 답변: 둘 다 필요합니다.
정답을 맞힌 것 같지만 최소한입니다.「속도」에는 일반적으로 unset()가 최적입니다만, (CPU를 희생해) 메모리를 즉시 회수하는 경우는, 늘을 사용하는 것이 좋습니다.
앞서 설명한 것과 같이 null로 설정했다고 해서 모든 것이 회수되는 것은 아닙니다.개체의 파괴를 방지하는 공유 메모리(클론되지 않은) 개체를 가질 수 있습니다.게다가, 다른 사람들이 말한 것처럼, 당신은 어차피 그 물건들을 명시적으로 "파괴"할 수 없기 때문에, 어쨌든 그것을 하려고 하지 말아야 한다.
어떤 것이 당신에게 최선인지 알아내야 할 것이다.또한 unset 또는 null로 호출되는 오브젝트에 __destruct()를 사용할 수 있지만 주의 깊게 사용해야 하며 다른 사용자가 말한 것처럼 직접 호출해서는 안 됩니다.
참조:
http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/
새로운 mysqli 객체를 만들고 있는 상황일 수 있습니다.
$MyConnection = new mysqli($hn, $un, $pw, $db);
하지만 당신이 그 물체를 닫은 후에도
$MyConnection->close();
사용하신다면print_r()
내용을 확인하다$MyConnection
, 다음과 같은 에러가 표시됩니다.
Error:
mysqli Object
Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)
이 경우 사용할 수 없습니다.unlink()
왜냐면unlink()
경로 이름 문자열이 필요하지만 이 경우$MyConnection
는 오브젝트입니다.
따라서 값을 null로 설정할 수 있습니다.
$MyConnection = null;
예상대로 일이 잘 풀리네요.변수 내부에 콘텐츠가 없습니다.$MyConnection
mysqli 오브젝트를 이미 청소했습니다.
변수 값을 다음과 같이 설정하기 전에 개체를 닫는 것이 좋습니다.null
.
PHP에서는 개체를 삭제하는 것이 아니라 개체에 대한 포인터를 삭제하는 것입니다.그것은 큰 차이입니다.
다른 언어에서는 오브젝트를 파기할 수 있습니다.다른 포인터는 예외나 쓰레기가 됩니다만, PHP의 경우는 아닙니다.
이것은 오브젝트를 파괴할 수 없다는 단순한 증명이며 오브젝트에 대한 링크만 파괴할 수 있습니다.
$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;
돌아온다
2
자세한 것은, https://eval.in/1054130 를 참조해 주세요.
클래스는 파괴할 수 있지만 오브젝트는 파괴할 수 없습니다.네, 개체를 설정 해제/삭제할 수 있습니다.
메모리를 더 빨리 사용할 수 있도록 가비지 컬렉터에 더 나은 힌트를 줄 수 있기 때문에 설정되지 않은 상태로 하겠습니다.오브젝트가 가리키는 것은 다른 참조가 있거나 먼저 설정이 해제되지 않도록 주의해 주세요.그렇지 않으면 가비지 컬렉터에 핸들이 없기 때문에 가비지 컬렉터를 기다려야 합니다.
언급URL : https://stackoverflow.com/questions/8798443/how-to-destroy-an-object
'programing' 카테고리의 다른 글
PHP에서 레이트 스태틱바인딩이란 정확히 무엇입니까? (0) | 2022.09.16 |
---|---|
정수를 롱으로 변환 (0) | 2022.09.16 |
numpy dtype을 네이티브 python 형식으로 변환하는 중 (0) | 2022.09.16 |
Galera 10 클러스터 노드에서 쿼리 삭제 (0) | 2022.09.16 |
php include 파일에 직접 액세스 금지 (0) | 2022.09.16 |