- ベストアンサー
[PHP] デストラクタについて教えて下さい
- PHPのデストラクタについて解説します。
- デストラクタはオブジェクトが破棄されるタイミングで実行され、主に終了処理を記述します。
- デストラクタを使うとクラス内のリソースを破棄することができます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
■リソースとは何か PHPでは、以下のURLに示すようなものをリソースといいます。 https://www.php.net/manual/ja/language.types.resource.php わかりづらいので、下記が具体例です。 <?php // data.txtファイルを読み取りモードで開く $fp = fopen('data.txt', 'r'); // data.txtのファイルの先頭から8192byte読み込む $data = fread($fp, 8192); // data.txtを閉じる fclose($fp); ?> この「ファイルを開いてファイルの一部を読み取る」プログラムの「$fp」という変数がリソース型の変数となります。 ファイルを開いたのち、fclose関数を実行してファイルを閉じるまで、リソース$fpは、data.txtを参照します。 ※ 厳密にはfcloseを叩かなくてもスクリプトが終了したら自動的に破棄されますが、ここではいったん気にしないでください。 ■オブジェクトが破棄されるタイミングはいつか オブジェクトはスクリプトが終了するタイミングとは別に、unset関数を実行したときにも、破棄されます。 上記2点を踏まえたうえで、この「ファイルを開いて8192byte読み込んで閉じる」プログラムをオブジェクトを用いて記述した例が以下です。 <?php class MyFileReader { private $fp = null; public function __construct($filePath) { $this->fp = fopen($filePath, 'r'); } public function read() { return fread($this->fp, 8192); } public function __destruct() { fclose($this->fp); } } // 以下のように使います // インスタンスを作成=ファイルが開きます $reader = new MyFileReader('data.txt'); // データを8192byte読み込みます $data = $reader->read(); // インスタンスを破棄します。 unset($reader); ?> このようになります。デストラクタにfcloseを書くことにより、MyFileReaderクラスのインスタンスをunsetで破棄したときに、メンバ変数$fpというリソースも同時に破棄されるようになりました。 以上です。
お礼
リソースとはDBなど外部と連携するもののことなのですね。 詳しくおしえくださりありがとうございます。