소멸자는 해당 클래스의 기능적 특징 중 생성자가 생성한 객체 인스턴스를 삭제하는 데 사용되는 함수입니다. PHP 프로그램에서 생성자를 사용할 때마다 해당 기능을 보완하기 위해 소멸자 함수를 갖는 것이 필수는 아닙니다. 그러나 생성자가 호출되는 프로그램에는 소멸자를 포함하는 것이 좋은 습관으로 간주됩니다. 또한 이 메서드는 실행을 위해 특별히 호출되지 않고 대신 컨트롤이 생성자 메서드에 대한 함수 참조를 더 이상 찾지 못할 때 실행됩니다.
소멸자를 호출하는 기본 구문: __destruct() 함수
광고 이 카테고리에서 인기 있는 강좌 PHP 개발자 - 전문 분야 | 8개 코스 시리즈 | 3가지 모의고사무료 소프트웨어 개발 과정 시작
웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등
구문:
__destruct ( void ) : void
모든 소멸자가 호출되려면 아래와 같이 그 앞에 생성자가 있어야 합니다.
<?php class <ANY_CLASS_NAME> { // Declaring a constructor function __construct() { // To initialize required properties } // Declaring a destructor function __destruct() { // To remove reference of an object } } ?>
소멸자는 기본적으로 더 이상 필요하지 않은 객체를 지우는 가비지 컬렉터에 의해 관리됩니다. 생성자와 달리 입력으로 인수를 사용할 수 없습니다.
이 방법은 리소스를 정리하고 더 많은 메모리를 수용할 수 있도록 메모리를 확보하는 데에도 사용됩니다. 소멸자는 오버로딩을 수행할 수 없으며 동일한 클래스에는 단 하나의 소멸자만 존재할 수 있습니다. 또 다른 독특한 특징은 exit() 명령을 사용하여 스크립트 실행을 중지하더라도 소멸자는 계속 호출된다는 것입니다. 이 종료()는 남은 종료 방법이 종료되는 것을 허용하지 않습니다.
소멸자를 더 잘 이해하기 위해 몇 가지 예를 들어보겠습니다.
이것은 기본 생성자 함수를 만든 다음 소멸자 함수를 호출하여 동일한 함수를 삭제하는 간단한 예입니다.
코드:
<?php class DestructableExample { function __construct() { print "Inside constructor\n"; } function __destruct() { print "Destroying the class " . __CLASS__ . "\n"; } } $obj = new DestructableExample();
출력:
이 예에서는 생성자에 두 개의 변수를 사용합니다. 직원의 이름과 성 그리고 소멸자를 호출하여 PHP 코드가 끝나기 직전에 Employee 개체를 삭제합니다.
코드:
<?php class Employee { // Employee's first name private $emp_fname; // Employee's last name private $emp_lname; // Declaration of constructor public function __construct($emp_fname, $emp_lname) { echo "Initialisation of object as follows...<br/>"; $this->emp_fname = $emp_fname; $this->emp_lname = $emp_lname; } // Declaration of destructor public function __destruct(){ // Here we can clean the resources echo "Removing the Object..."; } // This method is being used to display full name public function showName() { echo "Employee full name is: " . $this->emp_fname . " " . $this->emp_lname . "<br/>"; } } // Class object declaration $harry = new Employee("Harry", "Potter"); $harry->showName(); ?>
출력:
이 예에서는 기본 파일과 동일한 작업 디렉터리에 있어야 하는 전제 조건 텍스트 문서인 test_doc.txt 파일을 처리하는 방법을 살펴보겠습니다. 코드의 일부로 표시되어야 하는 test_doc.txt에 일부 텍스트를 포함해야 합니다.
fopen은 파일을 여는 데 사용되는 내장 함수이고, fread는 파일의 내용을 읽는 데 사용되는 함수입니다. 여기서 파일 핸들을 닫거나 삭제하기 위해 소멸자가 호출됩니다.
코드:
<?php header("Content-type: text/plain"); class Example { /** * Declaring an identifier * variable- string */ private $first_name; /** * A reference to another Foo object * variable Foo */ private $setlink; public function __construct($first_name) { $this->first_name = $first_name; } public function setLink(Example $setlink){ $this->setlink = $setlink; } public function __destruct() { echo 'Destroying: ', $this->first_name, PHP_EOL; } } // We are creating 2 objects here $obj1 = new Example('Example 1'); $obj2 = new Example('Example 2'); // Objects are made to point to themselves $obj1->setLink($obj1); $obj2->setLink($obj2); // Destroying their global references $obj1 = null; $obj2 = null; // Since both objects are declared null we cannot access them now and hence they must be destroyed // but since they are not yet destroyed a memory leak may occur as they are still present. // // Garbage collector can be called as shown in below line. Uncomment to check its functionality // gc_collect_cycles(); // Now we create 2 more objects but will not set their references // only the obj1 and obj2 are pointing to them right now $obj1 = new Example('Example 3'); $obj2 = new Example('Example 4'); // Removing their global references $obj1 = null; $obj2 = null; // Now the Example 3 and example 4 cannot be accessed due to no references // for them. Hence the destructor is called automatically // previous to the execution of next line echo 'Script has ended', PHP_EOL; ?>
출력:
코드에서 언급한 것처럼 스크립트 중앙에 있는 gc_collect_cycles() 함수의 주석을 해제하면 아래와 같은 출력이 나옵니다.
코드:
<?php class FileHandle{ private $file_handle; private $name; /** * We declare file handle with parameters file name and mode * Using parameter string $name as file name * Using parameter string $fmode as file mode for read, write */ public function __construct($name,$fmode){ $this->name = $name; $this->file_handle = fopen($name, $fmode); } /** * We are closing the file handle */ public function __destruct(){ if($this->file_handle){ fclose($this->file_handle); } } /** * Reading and printing file's content */ public function display(){ echo fread($this->file_handle, filesize($this->name)); } } $fu = new FileHandle('./test_doc.txt', 'r'); $fu->display(); ?>
출력:
test_doc.txt가 생성되지 않으면 다음과 같은 경고가 발생합니다.
우리가 본 것처럼 생성자의 정반대인 소멸자는 사용이 완료된 후 객체를 파괴하는 데 사용되며 코드에서 더 이상 필요하지 않습니다. 따라서 원치 않는 리소스를 정리하여 향후 리소스를 위한 공간을 확보합니다. 이는 스크립트 끝에서 PHP가 자동으로 호출하는 __destruct() 함수를 선언하여 수행됩니다.
위 내용은 PHP의 소멸자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!