PHP 변수나 객체의 소멸은 명시적 소멸과 암시적 소멸로 나눌 수 있습니다.
1. 명시적 소멸, 객체가 참조되지 않으면 소멸되므로 설정을 해제하거나 NULL을 할당할 수 있습니다. ;
2. 암시적 파괴, PHP는 스크립트 언어이므로 마지막 코드 줄이 실행될 때 적용된 모든 메모리를 해제해야 합니다.
위의 두 가지 파괴 방법 중에서 세 가지 방법을 요약할 수 있습니다. 즉,
1, unset()
2, $varname=null
3, destructor __destruct()
예를 들면 다음과 같습니다.
class Human { public $name = '张三'; public $gender = null; public function __destruct() { echo '死了!<br />'; } } $a = new Human(); $b = $c = $d = $a; unset($a); $d=null; echo '<hr />'; var_dump($a); echo '<hr />'; var_dump($b); echo '<hr />'; var_dump($c); echo '<hr />'; var_dump($d); 结果如下: Notice: Undefined variable: a in /Library/WebServer/Documents/test.php on line 42 NULL object(Human)#1 (2) { ["name"]=> string(6) "张三" ["gender"]=> NULL } object(Human)#1 (2) { ["name"]=> string(6) "张三" ["gender"]=> NULL } NULL 死了!
먼저 PHP에서는 변수 이름은 힙에 있는 특정 메모리의 주소를 가리키는 메모리 스택에 저장됩니다. 따라서 우리는 다음과 같은 결론을 내릴 수 있습니다.
<?php $a = 1; $b = &$a; unset($a); var_dump($a); var_dump($b);
결과는 다음과 같습니다.
Notice: Undefined variable: a in E:\amp\apache\htdocs\index.php on line 5 NULL int(1)그래서 unset()은 실제로 변수에 있는 메모리 값을 파괴하는 것이 아니라 변수와 메모리 사이의 관계를 끊고 변수 이름을 제거하지만 메모리가 있는 한 메모리는 해제되지 않습니다. 여전히 참조됩니다. PHP에서 값에 의한 객체 전달은 기본적으로 참조에 의한 전달입니다. 이는 또한 Human 클래스에서 $a가 unset()이지만 $b =$c = $d에는 여전히 값이 있음을 설명합니다.
2.$varname=null, 변수 이름은 여전히 존재하지만 메모리 값은 삭제됩니다. 그렇다면 참조별 전달의 경우는 어떨까요? 예:
<?php $a = 1; $b = &$a; $a=null; var_dump($a); var_dump($b);
输出的结果是: NULL NULL그래서 $varname=null, 변수 이름과 메모리 포인터는 여전히 존재하지만 메모리에 있는 값은 완전히 삭제됩니다.
3 위의 예에서 볼 수 있듯이 PHP가 마지막 코드 조각을 실행할 때 소멸자 __destruct()가 시작되지만 이러한 이해는 충분히 정확하지 않습니다. 예를 들어
<?php class Human{ public $name = '开始'; public function __destruct(){ echo '结束'; }} $a = new Human; echo $a->name; unset($a); //销毁函数 $a = new Human; echo '***********************'; 输出的结果是: 开始结束***************************结束
class Human{ public $name = '开始'; public function __destruct(){ echo '结束'; }} $a = new Human; $b = $a; echo $a->name; unset($a); //销毁函数 $a = new Human; echo '***************************'; 结果是: 开始***************************结束结束위 결과는 다음과 같습니다. 코드 마지막 줄이 실행될 때 시작되지 않고 객체가 소멸될 때 자동으로 실행됩니다. human() 함수에도 unset()이 있는데 소멸자 __destruct()가 마지막에 계속 실행되는 이유는 참조로 전달할 때 객체의 메모리가 취소되지 않고 객체가 완전히 소멸되지 않기 때문입니다.
결론은: 수동 소멸이 없으면 코드 실행이 완료된 후 메모리가 해제될 때 시스템이 자동으로 소멸자 __destruct()를 실행합니다. 객체가 소멸되면 소멸자가 자동으로 실행됩니다. .
추천 튜토리얼:위 내용은 PHP에서 변수를 삭제하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!