질문 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========== ============================
먼저 인스턴스화된 개체가 나중에 해제되는 이유를 설명합니다.
new Person(); 그런 다음 참조는 $p1에 할당되며 스택에 저장됩니다. 힙의 객체에 의해 할당된 엔터티동시에 PHP의 기본 저장 변수에는 변수의 수명 주기를 유지하기 위한 해시 기호 테이블이 있다는 것도 설명됩니다. 기호 테이블은 키=>값 쌍을 저장합니다. 는 변수 이름이고 zval 구조, 즉 값의 첫 번째 주소를 가리키는 키입니다 생성자와 소멸자의 실행은 실제로 Obj(2)가 나중에 생성되므로 스택 구조의 맨 위에 위치합니다. 스택은 먼저 들어온 것, 마지막으로 나온 것 순으로 파괴됩니다. , Obj(2)가 먼저 파괴됩니다.执行构造函数1 执行构造函数1 执行析构函数2 执行析构函数2
객체 지향
언어와 유사한 소멸자 개념을 도입했는지 알고 싶었습니다. 소멸자는 객체에 대한 모든 참조가 삭제되거나 객체가 명시적으로 소멸될 때 실행됩니다즉, 프로세스는 다음과 같습니다Obj(1) 启动,申请自己的内存空间与上下文环境
Obj(2) 启动,申请自己的内存空间与上下文环境
Obj(2) 销毁,垃圾回收
Obj(1) 销毁,垃圾回收
---------------------------- Obj(1) Obj(2) Obj(2) Obj(1) ----------------------------
위 내용은 PHP가 먼저 인스턴스화된 객체의 소멸자를 실행하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!