オブジェクト指向言語のPHPが備えるコンストラクタとデストラクタ
2015年2月10日(火)

フレームワークでの使われ方
コンストラクタとデストラクタは、ライブラリやフレームワークのクラスなどでもよく使われます。実際にコンストラクタやデストラクタがどのように使われているか、有名なフレームワークを覗いてみましょう。
まずはcakephp2のConsoleOutput.phpです。
ConsoleOutput.php(部分)
省略 : public function __construct($stream = 'php://stdout') { $this->_output = fopen($stream, 'w'); if (DS === '\\' && !(bool)env('ANSICON')) { $this->_outputAs = self::PLAIN; } } : 省略 : public function __destruct() { fclose($this->_output); } : 省略
コンストラクタで出力先のファイルなり、コンソールを開いておいて、デストラクタで閉じています。
次はCakeSocket.phpです。
CakeSocket.php(部分)
省略 : public function __construct($config = array()) { $this->config = array_merge($this->_baseConfig, $config); if (!is_numeric($this->config['protocol'])) { $this->config['protocol'] = getprotobyname($this->config['protocol']); } } : 省略 : public function __destruct() { $this->disconnect(); } : 省略
こちらは、ソケット通信を行うクラスですが、コンストラクタで設定情報を保持しておき、デストラクタで通信を切断しています。
最後はSymfony2のDebug/ErrorHandler.phpです。
ErrorHandler.php(部分)
省略 : class ErrorHandlerCanary { private static $displayErrors = null; public function __construct() { if (null === self::$displayErrors) { self::$displayErrors = ini_set('display_errors', 1); } } public function __destruct() { if (null !== self::$displayErrors) { ini_set('display_errors', self::$displayErrors); self::$displayErrors = null; } } } : 省略
デバッグ用にエラーを制御するクラスですが、コンストラクタでオブジェクト生成時にエラー出力設定であるdisplay_errorsをオンにし、元の設定値を保存しておきます。そしてデストラクタでオブジェクトを破棄する時に、display_errorsを元の値に戻しています。こうすることで、エラーを出力してデバッグできるようにしています。
このように、コンストラクタとデストラクタには色々な使い方があります。特にライブラリを書いたりする際には重宝します。メソッドで最初と最後に行われる処理の共通化にも利用できるので、きちんと使えると綺麗なコードになるでしょう。
PHP技術者認定試験では、コンストラクタとデストラクタに関する範囲はそれほど広くありませんが、上級エンジニアになるためにきちんと覚えておきましょう。
次回は「ファイルのアップロード処理」についてお話ししていきます。
ではまた。
【参考文献】
- PHPマニュアル http://php.net/manual/ja/
- Symfony2 http://symfony.com/
- Cakephp http://cakephp.jp/
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。