ホームページ  >  記事  >  バックエンド開発  >  PHP のデストラクター

PHP のデストラクター

WBOY
WBOYオリジナル
2024-08-29 12:42:16484ブラウズ

デストラクターは、その機能の一部として、特定のクラスのコンストラクターによって作成されたオブジェクト インスタンスを削除するために使用される関数です。 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
}
}
?>

PHP におけるデストラクターの働き

デストラクターは基本的に、オブジェクトが不要になったときにオブジェクトをクリアするガベージ コレクターによって管理されます。コンストラクターとは異なり、入力として引数を取ることはできません。

このメソッドは、リソースをクリーンアップし、メモリを解放してさらに多くのデータを収容できるようにするためにも使用されます。デストラクターを使用してオーバーロードを実行することはできません。同じクラス内に存在できるデストラクターは 1 つだけです。もう 1 つのユニークな機能は、スクリプトが exit() コマンドの助けを借りて実行を停止した場合でも、デストラクターは引き続き呼び出されることです。この 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

この例では、コンストラクターで 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 さえも与えません)。
  • デストラクターを介した継承は許可されません
  • デストラクターが静的であることは必須ではありません
  • デストラクタのアドレス参照はできません
  • デストラクターを含むクラスに属するオブジェクトは、共用体のメンバーになることはできません。
  • デストラクター関数にはパブリック アクセスが必要です。

結論

これまで見てきたように、コンストラクターの正確な逆であるデストラクターは、オブジェクトの使用が完了した後にオブジェクトを破棄するために使用され、コード内ではこれ以上必要になりません。これにより、不要なリソースが確実にクリーンアップされ、将来のリソースのためのスペースが確保されます。これは、スクリプトの最後で PHP によって自動的に呼び出される __destruct() 関数を宣言することで行われます。

以上がPHP のデストラクターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。