>백엔드 개발 >PHP 튜토리얼 >PHP 소멸자 문제 해결

PHP 소멸자 문제 해결

黄舟
黄舟원래의
2017-07-02 10:15:411180검색

 객체 지향 프로그래밍이 널리 발전하면서 객체 지향 프로그래밍에는 많은 흥미로운 문제가 드러났습니다. 많은 초보자들이 php 객체지향, constructor, destructor을 배우다 보면 두 가지 함수를 접하게 되리라 믿습니다. 생성자는 더 많이 사용하고 소멸자는 덜 사용하는 것 같습니다. (초보자의 제한된 프로그래밍 경험에 비해 작성자도 마찬가지입니다.) 기능적으로는 객체가 생성될 때 생성자가 호출되고, 객체가 생성될 때 소멸자가 호출됩니다. 호출할 때 한쪽 끝과 한쪽 끝을 따로 호출할 필요는 없지만 앞면과 뒷면이기도 합니다.   소멸자가 자주 처리하는 일은 리소스 해제 작업입니다. 예를 들어 앞에는 fopen()이 있고 여기서는 fclose()가 호출되고 앞에는 imagecreatefromjepg()가 호출되고 여기서는 imagedestory()가 호출됩니다. 물론 이는 몇 가지 일반적인 예입니다. 객체가 파괴되거나 스크립트가 실행될 때 실행되는 일반 함수로 취급할 수 있습니다.

 이제 오늘의 주요 질문을 최대한 빨리 제기해 보겠습니다.

<?php
class Test{
    public function destruct(){
        echo "执行析构函数";
    }
 }
$test1=new Test;
$test2=$test3=$test1;
unset($test1);
echo "<hr/>";
 이 스크립트를 실행한 결과는 무엇입니까? 이 질문에 답하기 전에 위에 표시한 단어를 다시 살펴보세요. 출력 구분선

unset

(

$test1

)

전에는 소멸자를 호출하고

$test2,$test3이 있어야 한다는 것을 당연하게 생각할 수 있습니다. 스크립트 소멸자는 실행 후에 호출됩니다. 즉, 텍스트 1단락은 구분선 위에 출력되고, 텍스트 2단락은 구분선 아래에 출력됩니다. 이때는 소멸자를 언제 호출해야 하는지 알 수 있으니 조금은 뿌듯해하셔도 됩니다. 하지만 이것이 정말 사실일까요? 실행 결과를 살펴볼 수 있습니다. 야 젠장 왜 한 문장만 출력한 거야? ? ? 사실, 우리는 기본적으로 객체 할당이 참조 할당이라는 중요한 전제 조건을 간과했습니다

. 많은 분들이 이 점을 눈치채지 못하셨는데, 초보자분들은 좀 더 주의를 기울여주시길 바랍니다.

참조 할당이기 때문에 일반 변수에 대한 이해가 결합되어 세 개의 변수 이름이 동일한 저장 주소를 가리킨다는 것을 금방 알았습니다. 그렇다면

unset

(

$test1)은 어떤 역할을 할까요? ? ? 저장소 주소를 가리키는 변수를 파기할까요, 아니면 저장소 주소에 저장된 내용을 파기할까요?

  unset() 함수의 사용법을 이해했다면 직관적으로 이 단락을 건너뛰시기 바랍니다. 이 고통스러운 문제를 생각하면서 매뉴얼을 확인해 보는 것은 어떨까요?   동일하게 참조로 전달되며, 저장주소를 가리키는 변수명만 파기됩니다. unset()의 일반 함수와 결합하면 다음과 같이 설명할 수 있습니다. 여러 변수 이름이나 객체 이름이 저장 주소를 가리키는 경우 unset() 함수의 함수는 변수 이름의 포인터를 파괴하고 변수 이름이나 객체 이름이 하나만 있는 경우 unset은 지정된 저장소 주소의 콘텐츠를 삭제합니다.

실제 저장 콘텐츠는 TV라고 상상할 수 있습니다. 여러 사람(여러 변수명 또는 객체명)이 TV를 시청하고 있습니다. unset() 이후에는 아무도 시청을 중단하고 떠나지 않았지만 TV는 여전히 켜져 있었습니다. 한 사람만 TV를 시청하고 있을 때, unset() 후, 그 사람이 나갈 때 TV를 꺼야 하는데, 이는 점유된 저장 공간을 해제하기 위한 것입니다. 이 부분의 내용에 관심이 있으시면 "PHP의 세 가지 구현 방법

재귀 함수"도 살펴보세요.

 좋아, 주제로 돌아가자. unset($test1) 후에도 원본 개체는 그대로 유지됩니다. 구분선이 출력되면 스크립트가 실행되고 소멸자가 호출됩니다. 객체가 하나뿐이므로 소멸자 호출은 한 번만 호출됩니다. 위와 같은 결과가 출력되는 것은 당연하다.

관련된 몇 가지 흥미로운 질문: 프로그램에서 소멸자를 호출하는 방법은 여러 가지가 있습니다. 개체가 null 또는 false로 설정되었는지 여부에 관계없이 다른 개체는 영향을 받지 않습니다. 이는 여전히 일반 변수와 다릅니다. (unset() 함수의 효과는 동일합니다). 관심이 있으시면 시도해 볼 수 있습니다.

  또 다른 당황스러운 점은 생성자가 constructor()를 사용할 수 있다는 것을 우리 모두 알고 있지만 동일한 이름을 가진 생성자를 무시한다는 것입니다. 그러므로 모두가 주의를 기울여야 합니다.

위 내용은 PHP 소멸자 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.