>  기사  >  백엔드 개발  >  PHP의 객체 참조와 소멸자 간의 관계에 대해

PHP의 객체 참조와 소멸자 간의 관계에 대해

黄舟
黄舟원래의
2017-07-02 10:27:361242검색

 PHP에서 constructordestructor는 모두 magic method에 속합니다. 예를 들어 특정 클래스의 생성자는 클래스가 인스턴스화될 때 자동으로 호출되고 소멸자는 인스턴스화될 때 자동으로 호출됩니다. 이 클래스의 object는 기본적으로 프로그램 실행이 끝나면 자동으로 호출됩니다.

 객체에 대한 참조를 만들면 $obj와 같은 객체가 하나만 인스턴스화되는 경우 $obj = null; 문이 있는 한 소멸자 호출도 변경됩니다. 이때 $obj 객체가 소멸된다는 의미는 소멸자가 일찍 호출되지만 이 클래스의 다른 객체는 영향을 받지 않습니다.

  $obj1 = &$obj; 즉 & 기호 참조 할당 작업을 사용하면 이 작업은 개체에 대한 새 참조를 생성하지 않습니다. 소위 두 개체는 실제로 동일한 메모리 힙 공간을 사용합니다. $ obj 또는 $obj1 중 하나가 소멸되면 다른 것도 동시에 사라집니다.

  $obj1 = $obj; 연산을 사용하면 $obj 또는 $obj1이 삭제되면 소멸자가 실행되지 않습니다. 다른 객체는 여전히 정상적으로 사용될 수 있으며, 둘 다 파괴될 때까지 소멸자는 실행되지 않습니다. 이는 둘이 여전히 통합된 관계를 가지고 있음을 보여줍니다. 이 참조 작업은 상호 관계를 생성하지 않습니다. 관계를 방해하지 않지만 객체를 참조하는 새 객체입니다. 한 객체의 구성원이 변경되면 다른 객체의 구성원도 그에 따라 변경되고 서로 관련되므로 =를 사용한 직접 할당은 =& 연산 사이에 있습니다. 그리고 클론 작업 상황.

복제 작업을 수행하면 $obj1 = clone $obj입니다. 이 작업에서 $obj1과 $obj는 서로 간섭하지 않는 두 개체입니다. , $obj1의 모든 구성원 속성값은 $obj와 정확히 동일합니다. 이것이 진정한 복제입니다. 복사할 때 클래스에 clone() 매직 메서드를 작성하여 $obj1의 일부 속성에 새 값을 제공하거나 원하지 않는 값을 차단할 수도 있습니다. 다음은 구현 메서드의 간단한 예입니다.

class Player{
    public $name;
    function destruct(){
        echo "Destroying ".$this->name."<br />";
    }
    //设置魔术方法,赋值时会自动调用这里的属性值,作用是初始化值,或屏蔽不想要的值
    function clone(){
        $this->name="gbcs";
    }
}
$james=new Player();
$james2=clone $james;
echo $james2->name.&#39;<br />&#39;;
$james->name="james";
$james2->name="james2";
echo $james->name.&#39;<br />&#39;;
$james=null;
echo $james2->name.&#39;<br />&#39;;

실행 결과는 다음과 같습니다.

실행 결과에 따르면 clone이 서로 독립된 두 개의 객체를 생성하는 것과 매직 메소드를 생성하는 것을 명확하게 알 수 있습니다. clone()도 호출되는데, 생성자 실행 순서를 보면 두 객체가 별도로 소멸되는 것을 볼 수 있는데 이는 할당과 다른 의미를 갖는다.

위 내용은 PHP의 객체 참조와 소멸자 간의 관계에 대해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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