TOP書籍連動> コンストラクタとデストラクタ
まるごと PHP!
まるごと PHP!

Part1:PHP5のオブジェクト指向(1)

著者:桝形誠二(MASUGATA, Seiji)   2005/2/22
前のページ   1   2
コンストラクタとデストラクタ

   コンストラクタは以前から存在していました。コンストラクタはオブジェクトが生成されるたびに呼び出されるので、初期化処理などを行うのに有効です。

   PHP5では、コンストラクタが一新されました。互換性のため、古い形式(クラス名と同名のメソッド)でも使うことができますが、今後は以降で紹介する新しい形式に統一したほうがよいでしょう。

   デストラクタは、オブジェクトが破棄された場合に呼び出されます。たとえば、ログ出力、メール送信、データベース接続終了、その他目的に応じた処理を行いたい場合に有効です。

   PHP5でコンストラクタを定義するには、「__construct」を使います。デストラクタを定義するには、「__destruct」を使います。

   継承を行っている場合でも、親クラスのコンストラクタやデストラクタは自動的には呼ばれません。親クラスのコンストラクタやデストラクタを実行したい場合には、コンストラクタメソッドやデストラクタメソッドの中で明示的に「parent::__construct( )」や「parent::__destruct( )」を実行する必要があります(リスト3)。

リスト3:const_dest.php
<?
class MainConstDestruct
{
function __construct( )
{
echo "Main Start!!\n";
}

function __destruct( )
{
echo "Main End!!\n";
}
}

class SubConstDestruct extends MainConstDestruct
{
function __construct( )
{
parent::__construct( );
echo "Sub Start!!\n";
}

function __destruct( )
{
echo "Sub End!!\n";
parent::__destruct( );
}
}

$SubConstDestruct = new SubConstDestruct( );
$ConstDestruct = null;

?>
Private/Protectedのメンバー変数とメソッド

   今までのメンバー変数はすべてpublic扱いで、外部から呼出しや参照ができてしまいましたが、PHP5ではこれらを制御できるようになりました。

   メンバー変数、メソッドに対して「protected」や「private」の定義を行うことで、アクセスを制御できます(リスト4、リスト5)。

リスト4:pri_pro_h.php
<?
class PrivateProtected
{
private $Foo = "Private String!!\n";
protected $Bar = "Protected String!!\n";

function getPrint( )
{
echo $this->Foo;
echo $this->Bar;
}
}

class MyPrivateProtected extends PrivateProtected
{
function getPrint( )
{
echo "------------------\n";
PrivateProtected::getPrint( );
echo "------------------\n";
echo $this->Foo;
echo $this->Bar;
}
}

class MyMyPrivateProtected
{
function getPrint( )
{
echo "------------------\n";
PrivateProtected::getPrint( );
echo "------------------\n";
}
}

$PrivateProtected = new PrivateProtected( );

//echo $PrivateProtected->Foo;
//echo $PrivateProtected->Bar;
echo $PrivateProtected->getPrint( );

$MyPrivateProtected = new MyPrivateProtected( );
echo $MyPrivateProtected->Foo;
//echo $MyPrivateProtected->Bar;
echo $MyPrivateProtected->getPrint( );

$MyMyPrivateProtected = new MyMyPrivateProtected( ); $MyMyPrivateProtected->getPrint( );

?>

リスト5:pri_pro_m.php
<?
class PrivateProtected
{
private function PrivatePrint( )
{
echo "PrivateMethod!!\n";

}

protected function ProtectedMethod( )
{
echo "ProtectedMethod!!\n";
}

function getPrint( )
{
$this->PrivatePrint( );
$this->ProtectedMethod( );
}
}

class MyPrivateProtected extends PrivateProtected
{
function getPrint( )
{
// $this->PrivatePrint( );
$this->ProtectedMethod( );
}
}

$PrivateProtected = new PrivateProtected( );

//echo $PrivateProtected->PrivatePrint( );
//echo $PrivateProtected->ProtectedMethod( );
echo $PrivateProtected->getPrint( );

$MyPrivateProtected = new MyPrivateProtected( );
echo $MyPrivateProtected->getPrint( );

?>

   許可していない位置からPrivateなどのメンバー変数・メソッドにアクセスを行うと、次のようなエラーが出力されます。

  • Fatal error: Cannot access private property
  • Fatal error: Cannot access protected property
  • Fatal error: Call to private method
  • Fatal error: Call to protected method

   「protected」と「private」の違いは、「protected」は宣言されたクラスとそこから継承されたクラスからアクセスすることができるのに対し、「private」は宣言されたクラスからのみアクセスできるというものです。

前のページ   1   2



著者プロフィール
桝形 誠二
様々な言語を経験していく中でPHPと出会い、初心者に易しいという魅力に惹かれ続けて早5年。色んな事をPHPで実装しようとしすぎて周囲の反感を買いやすいのが最近の悩み。


INDEX
Part1:PHP5のオブジェクト指向(1)
  飛躍的に改善されたオブジェクト機能
コンストラクタとデストラクタ