>  기사  >  백엔드 개발  >  PHP가 먼저 인스턴스화된 객체의 소멸자를 실행하는 이유는 무엇입니까?

PHP가 먼저 인스턴스화된 객체의 소멸자를 실행하는 이유는 무엇입니까?

黄舟
黄舟원래의
2017-07-02 10:44:571603검색

질문 1: 질문은 말씀드린대로 제가 직접 테스트해봤습니다

class Obj{        
public $i;        
        public function construct($t){            
        $this->i = $t;            
        echo "执行构造函数$this->i";            
        echo "<br>";
        }        
        public function destruct(){            
        echo "执行析构函数$this->i";            
        echo "<br>";
        }
    }
    $obj1 = new Obj(1);
    $obj2 = new Obj(2);

执行构造函数1执行构造函数2执行析构函数2执行析构函数1

질문 2: 하위 클래스에서 상위 클래스의 생성자 메서드를 호출할 때 상위 클래스만 초기화하고, 객체를 생성하는 건가요? 부모 클래스의?

======================================업데이트========= =============================

더 이해하기 쉬운 설명 찾기:

데이터를 저장하기 위해 힙을 사용할지 아니면 스택을 사용할지 여부 PHP에 의해 결정되며, PHP 개발자는 신경 쓸 필요가 없습니다.
전송:
PHP5의 Zend 엔진 구현에서는 모든 값이 힙에 할당된 공간이며 참조 카운팅 및 가비지 수집을 통해 관리됩니다.
PHP5의 zval 구조에 대한 Zend 엔진 포인터는 주로 값을 연산하는 데 사용되며, 많은 곳에서 zval의 보조 포인터를 통해 연산됩니다.
PHP7의 Zend 엔진 구현에서는 값이 zval 구조 자체를 통해 연산됩니다. (포인터 아님) zval 구조는 VM 스택, HashTable 버킷 및 속성 슬롯에 직접 저장되며, 이는 힙에 메모리를 할당하고 해제하는 작업을 크게 줄입니다. 단순 값의 참조 계산 및 가비지 수집을 방지합니다.
=================================== UPDATE1========== ============================

구체적인 지침이 있는 곳을 찾았어요

$p1 = new Person(); 이 코드의 경우 $p1은 스택 메모리의 개체 이름입니다. new Person()은 힙 메모리의 실제 개체입니다.

먼저 인스턴스화된 개체가 나중에 해제되는 이유를 설명합니다. PHP가 먼저 인스턴스화된 객체의 소멸자를 실행하는 이유는 무엇입니까?

new Person(); 그런 다음 참조는 $p1에 할당되며 스택에 저장됩니다. 힙의 객체에 의해 할당된 엔터티

동시에 PHP의 기본 저장 변수에는 변수의 수명 주기를 유지하기 위한 해시 기호 테이블이 있다는 것도 설명됩니다. 기호 테이블은 키=>값 쌍을 저장합니다. 는 변수 이름이고 zval 구조, 즉 값의 첫 번째 주소를 가리키는 키입니다

생성자와 소멸자의 실행은 실제로 Obj(2)가 나중에 생성되므로 스택 구조의 맨 위에 위치합니다. 스택은 먼저 들어온 것, 마지막으로 나온 것 순으로 파괴됩니다. , Obj(2)가 먼저 파괴됩니다.

포스터의 질문을 읽은 후 저는 왜

执行构造函数1
执行构造函数1
执行析构函数2
执行析构函数2

PHP 5가 C++와 같은 다른

객체 지향

언어와 유사한 소멸자 개념을 도입했는지 알고 싶었습니다. 소멸자는 객체에 대한 모든 참조가 삭제되거나 객체가 명시적으로 소멸될 때 실행됩니다

즉, 프로세스는 다음과 같습니다

Obj(1) 启动,申请自己的内存空间与上下文环境
Obj(2) 启动,申请自己的内存空间与上下文环境
Obj(2) 销毁,垃圾回收
Obj(1) 销毁,垃圾回收
선입 및 후진과 같은 Obj(1)입니다. 인스턴스화 후, 먼저 파괴하세요
----------------------------
Obj(1) Obj(2) Obj(2) Obj(1)
----------------------------

질문 2: 하위 클래스에서 상위 클래스의 생성자 메서드를 호출하면 상위 클래스만 초기화되고 상위 클래스의 객체가 생성되나요?

동일한 매뉴얼. 상속은 잘 알려진 프로그래밍 기능이며 PHP의 개체 모델도 상속을 사용합니다. 상속은 클래스와 개체 및 개체 간의 관계에 영향을 미칩니다.

예를 들어, 클래스를 확장하면 하위 클래스는 상위 클래스의 모든 공개 및 보호 메서드를 상속합니다. 하위 클래스가 상위 클래스의 메서드를 재정의하지 않는 한 상속된 메서드는 원래 기능을 유지합니다.

하위 클래스는 상위 클래스 메서드를 호출할 수 있으며 상속 관계에는 인스턴스화가 없습니다.

내 생각:

질문 1: 객체 참조를 보유하는 변수는 스택에 저장됩니다. 변수 obj2는 먼저 Obj1과 비교됩니다.

질문 2: 단 하나의 하위 클래스 객체만 생성됩니다

첫 번째 질문: Obj1과 obj2는 스택 메모리의 특성에 따라 자연스럽게 스택 메모리에 저장됩니다. 스택 메모리의 특성에 따라 먼저 소멸됩니다. 즉, obj2의 소멸이 먼저 실행된 다음 obj1이 소멸됩니다. 즉, obj1의 _desctruct가 실행됩니다. 이는 또한 주문 문제를 설명합니다.

두 번째 질문: 상위 클래스 객체는 생성되지 않습니다. 하위 클래스를 인스턴스화하면 상위 클래스의 공개 및 보호 메서드가 인스턴스화된 객체에 있게 됩니다. 따라서 부모 클래스의 메서드를 호출할 수 있습니다.

위 내용은 PHP가 먼저 인스턴스화된 객체의 소멸자를 실행하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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