PHP クラスのコンストラクタ
クラス
前回に引き続き、今回もクラスについて記述していきたいと思います。
コンストラクタ
コンストラクタとは、クラスから新しくオブジェクトを作成する際に実行させることができる処理です。
コンストラクタを使用すると、オブジェクトの初期化時に引数を与えたりさせることも可能になります。
コンストラクタの記述方法
コンストラクタはPHP5では以下のように __construct という名前を通常のメソッドのようにして宣言し、
その中にコンストラクタの処理を記述します。
class クラス名{
アクセス修飾子 function __construct(){
コンストラクタの処理内容;
}
}
このように __construct という文字はコンストラクタ用に使用するようにPHPによりあらかじめ決められているので、
通常のメソッド名に使用することはできません。
またコンストラクタの記述方法は、PHP4以前とPHP5で異なっています。
PHP4以前では以下のようにメソッド名が、クラス名と同じ名前である必要がありました。
class クラス名{
アクセス修飾子 function クラス名(){
コンストラクタの処理内容;
}
}
一応PHP5でも互換性を保つため、この書き方でもコンストラクタだと認識できるようになっています。
コンストラクタを使用したサンプル
以下はコンストラクタを記述する例です。
オブジェクトを new で作成した時点で、コンストラクタ内の処理が行われています。
なので $obj->__construct のようにしなくても処理が実行されることが分かります。
<?php
class test{
public function __construct(){
echo "construct内の処理";
}
}
$obj = new test;
?>
結果は以下のようにコンストラクタ内に記述している処理が実行されています。

またコンストラクタの処理を生成後にメソッドのように呼び出すこともできます。
<?php
class test{
public function __construct(){
echo "construct内の処理";
}
}
$obj = new test;
$obj->__construct();
?>
結果はコンストラクタの処理が2回実行されていることになります。

PHP4以前の書き方の場合
PHP4以前ではコンストラクタは以下のように記述します。
クラス名とクラス内のメソッド名が同じ test になっています。
<?php
class test{
public function test(){
echo "construct内の処理";
}
}
$obj = new test;
?>
結果は同じようにオブジェクトを生成した時点でコンストラクタの内容が実行されています。

コンストラクタに引数を渡す
コンストラクタには引数を渡すこともできます。
以下ではコンストラクタに数字の 10 を渡してそれを表示しています。
<?php
class test{
public function __construct($hensuu){
echo "construct内の処理<br>";
echo $hensuu;
}
}
$obj = new test(10);
?>
結果は以下のように表示することができました。
引数を ,(カンマ) で分ければ一度の複数の引数を渡すこともできます。

デストラクタ
コンストラクタはオブジェクトを生成した際に実行されますが、
デストラクタはオブジェクトを破棄する際に実行されます。
デストラクタはPHP5から記述できるようになりました。
またデストラクタにはコンストラクタのように引数を与えることはできません。
デストラクタの記述方法
デストラクタはコンストラクタと同じように以下のように記述します。
class クラス名{
アクセス修飾子 function __destruct(){
デストラクタの処理内容;
}
}
デストラクタの実行のタイミング
デストラクタは具体的には以下のようなタイミングに実行させることができます。
・プログラムの終了時
・unsetでオブジェクトの中身を破棄する時
・オブジェクトに null を代入した時
デストラクタのサンプル
以下ではプログラムを終了する際にオブジェクトの内容が破棄されるので、
デストラクタの内容が実行されています。
<?php
class test{
public function __destruct(){
echo "destruct内の処理<br>";
}
}
$obj = new test;
echo "プログラムを終了します<br>";
?>
結果は以下のように、プログラムの終了間際にデストラクタの内容が実行されていることが分かります。

unset や null を代入した際にも実行させることができます。
unsetを使用した場合
<?php
class test{
public function __destruct(){
echo "destruct内の処理<br>";
}
}
$obj = new test;
unset($obj);
echo "プログラムを終了します<br>";
?>
nullを代入した場合
<?php
class test{
public function __destruct(){
echo "destruct内の処理<br>";
}
}
$obj = new test;
$obj = null;
echo "プログラムを終了します<br>";
?>
他にもexitやdieでプログラム終了する際にもデストラクタは実行されます。
デストラクタが複数記述してあった場合
クラスが複数宣言してあってデストラクタも複数存在していた場合、
プログラム終了時に全てのデストラクタが実行されますが、
その順番はオブジェクトを生成した順番の反対になるようです。
そのため以下のようなコードがあったとすると、後から生成したものから実行されていくので、
testcのデストラクタ → testbのデストラクタ → testaのデストラクタ
のように実行されるようです。
<?php
class testa{
public function __destruct(){
echo "testa destruct内の処理<br>";
}
}
class testb{
public function __destruct(){
echo "testb destruct内の処理<br>";
}
}
class testc{
public function __destruct(){
echo "testc destruct内の処理<br>";
}
}
$obj1 = new testa;
$obj2 = new testb;
$obj3 = new testc;
echo "プログラムを終了します<br>";
?>
結果は以下のようになっています。

