デストラクターは、その機能の一部として、特定のクラスのコンストラクターによって作成されたオブジェクト インスタンスを削除するために使用される関数です。 PHP プログラムでコンストラクターを使用する場合、その機能を補完するデストラクター関数を使用することは必須ではありません。ただし、コンストラクターが呼び出されるプログラム内でデストラクターを使用することは良い習慣であると考えられています。また、このメソッドは実行のために特別に呼び出されるわけではなく、コントロールがコンストラクター メソッドへの関数参照を見つけられなくなったときに実行されます。
デストラクターを呼び出すための基本構文: __destruct() 関数、
広告 このカテゴリーの人気コース PHP 開発者 - 専門分野 | 8コースシリーズ | 3 つの模擬テスト無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
構文:
__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 } } ?>
デストラクターは基本的に、オブジェクトが不要になったときにオブジェクトをクリアするガベージ コレクターによって管理されます。コンストラクターとは異なり、入力として引数を取ることはできません。
このメソッドは、リソースをクリーンアップし、メモリを解放してさらに多くのデータを収容できるようにするためにも使用されます。デストラクターを使用してオーバーロードを実行することはできません。同じクラス内に存在できるデストラクターは 1 つだけです。もう 1 つのユニークな機能は、スクリプトが exit() コマンドの助けを借りて実行を停止した場合でも、デストラクターは引き続き呼び出されることです。この exit() は、残ったシャットダウン メソッドの終了を許可しません。
デストラクターをよりよく理解するためにいくつかの例を見てみましょう:
これは、基本的なコンストラクター関数を作成し、デストラクター関数を呼び出して同じコンストラクター関数を破棄する簡単な例です。
コード:
<?php class DestructableExample { function __construct() { print "Inside constructor\n"; } function __destruct() { print "Destroying the class " . __CLASS__ . "\n"; } } $obj = new DestructableExample();
出力:
この例では、コンストラクターで 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(); ?>
出力:
この例では、メイン ファイルと同じ作業ディレクトリに存在する前提条件のテキスト ドキュメントであるファイル 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 中国語 Web サイトの他の関連記事を参照してください。