フレームワークでの使われ方
コンストラクタとデストラクタは、ライブラリやフレームワークのクラスなどでもよく使われます。実際にコンストラクタやデストラクタがどのように使われているか、有名なフレームワークを覗いてみましょう。
まずはcakephp2のConsoleOutput.phpです。
ConsoleOutput.php(部分)
04 | $this->_output = fopen($stream, 'w'); |
06 | if (DS === '\\' && !(bool)env('ANSICON')) { |
07 | $this->_outputAs = self::PLAIN; |
13 | public function __destruct() { |
14 | fclose($this->_output); |
コンストラクタで出力先のファイルなり、コンソールを開いておいて、デストラクタで閉じています。
次はCakeSocket.phpです。
CakeSocket.php(部分)
03 | public function __construct($config = array()) { |
04 | $this->config = array_merge($this->_baseConfig, $config); |
05 | if (!is_numeric($this->config['protocol'])) { |
06 | $this->config['protocol'] = getprotobyname($this->config['protocol']); |
12 | public function __destruct() { |
こちらは、ソケット通信を行うクラスですが、コンストラクタで設定情報を保持しておき、デストラクタで通信を切断しています。
最後はSymfony2のDebug/ErrorHandler.phpです。
ErrorHandler.php(部分)
03 | class ErrorHandlerCanary |
05 | private static $displayErrors = null; |
07 | public function __construct() |
09 | if (null === self::$displayErrors) { |
10 | self::$displayErrors = ini_set('display_errors', 1); |
14 | public function __destruct() |
16 | if (null !== self::$displayErrors) { |
17 | ini_set('display_errors', self::$displayErrors); |
18 | self::$displayErrors = null; |
デバッグ用にエラーを制御するクラスですが、コンストラクタでオブジェクト生成時にエラー出力設定であるdisplay_errorsをオンにし、元の設定値を保存しておきます。そしてデストラクタでオブジェクトを破棄する時に、display_errorsを元の値に戻しています。こうすることで、エラーを出力してデバッグできるようにしています。
このように、コンストラクタとデストラクタには色々な使い方があります。特にライブラリを書いたりする際には重宝します。メソッドで最初と最後に行われる処理の共通化にも利用できるので、きちんと使えると綺麗なコードになるでしょう。
PHP技術者認定試験では、コンストラクタとデストラクタに関する範囲はそれほど広くありませんが、上級エンジニアになるためにきちんと覚えておきましょう。
次回は「ファイルのアップロード処理」についてお話ししていきます。
ではまた。
【参考文献】