PHP의 소멸자

WBOY
풀어 주다: 2024-08-29 12:42:16
원래의
475명이 탐색했습니다.

소멸자는 해당 클래스의 기능적 특징 중 생성자가 생성한 객체 인스턴스를 삭제하는 데 사용되는 함수입니다. 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
}
}
?>
로그인 후 복사

PHP에서 소멸자 작업

소멸자는 기본적으로 더 이상 필요하지 않은 객체를 지우는 가비지 컬렉터에 의해 관리됩니다. 생성자와 달리 입력으로 인수를 사용할 수 없습니다.

이 방법은 리소스를 정리하고 더 많은 메모리를 수용할 수 있도록 메모리를 확보하는 데에도 사용됩니다. 소멸자는 오버로딩을 수행할 수 없으며 동일한 클래스에는 단 하나의 소멸자만 존재할 수 있습니다. 또 다른 독특한 특징은 exit() 명령을 사용하여 스크립트 실행을 중지하더라도 소멸자는 계속 호출된다는 것입니다. 이 종료()는 남은 종료 방법이 종료되는 것을 허용하지 않습니다.

PHP의 소멸자 예

소멸자를 더 잘 이해하기 위해 몇 가지 예를 들어보겠습니다.

예시 #1

이것은 기본 생성자 함수를 만든 다음 소멸자 함수를 호출하여 동일한 함수를 삭제하는 간단한 예입니다.

코드:

<?php
class DestructableExample
{
function __construct() {
print "Inside constructor\n";
}
function __destruct() {
print "Destroying the class " . __CLASS__ . "\n";
}
}
$obj = new DestructableExample();
로그인 후 복사

출력:

PHP의 소멸자

예시 #2

이 예에서는 생성자에 두 개의 변수를 사용합니다. 직원의 이름과 성 그리고 소멸자를 호출하여 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();
?>
로그인 후 복사

출력:

PHP의 소멸자

예시 #3

이 예에서는 기본 파일과 동일한 작업 디렉터리에 있어야 하는 전제 조건 텍스트 문서인 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;
?>
로그인 후 복사

출력:

PHP의 소멸자

코드에서 언급한 것처럼 스크립트 중앙에 있는 gc_collect_cycles() 함수의 주석을 해제하면 아래와 같은 출력이 나옵니다.

예시 #4

코드:

<?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();
?>
로그인 후 복사

출력:

PHP의 소멸자

test_doc.txt가 생성되지 않으면 다음과 같은 경고가 발생합니다.

PHP의 소멸자

소멸자의 장점

  • 소멸자는 메모리 할당을 해제하여 생성자가 새로 생성한 객체에 필요한 공간이 있는지 확인하거나 다른 작업을 위한 리소스를 확보하는 데 도움이 됩니다.
  • 정리 프로세스를 관리하므로 모든 작업이 효율적으로 실행되도록 합니다.
  • 많은 변수와 구조체가 할당된 경우 소멸자를 사용하면 내부 리소스를 해제하여 메모리 누수를 방지하는 데 도움이 됩니다.
  • 정적 변수와 지역 변수를 모두 관리합니다.

소멸자의 한계

  • 소멸자는 매개변수를 사용할 수 없으며 반환 값(void도 포함)을 제공하지 않습니다.
  • 소멸자를 통한 상속은 허용되지 않습니다
  • 소멸자가 정적일 필요는 없습니다
  • 소멸자의 주소 참조는 불가능합니다
  • 소멸자를 포함하는 클래스에 속하는 객체는 Union 멤버가 될 수 없습니다.
  • 소멸자 함수에는 반드시 공개 액세스 권한이 있어야 합니다.

결론

우리가 본 것처럼 생성자의 정반대인 소멸자는 사용이 완료된 후 객체를 파괴하는 데 사용되며 코드에서 더 이상 필요하지 않습니다. 따라서 원치 않는 리소스를 정리하여 향후 리소스를 위한 공간을 확보합니다. 이는 스크립트 끝에서 PHP가 자동으로 호출하는 __destruct() 함수를 선언하여 수행됩니다.

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

관련 라벨:
php
원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!