TOP書籍連動> __call( )、__get( )、__set( )
まるごと PHP!
まるごと PHP!

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

著者:桝形誠二(MASUGATA, Seiji)   2005/2/28
1   2  次のページ
__call( )、__get( )、__set( )

   最後に紹介するのは、__call( )、__get( )、__set( )というメソッドです。それぞれ、存在しないメソッドの呼び出し、存在しないメンバー変数の参照、存在しないメンバー変数への代入に対して制御することができます。

   存在しないクラスのメソッドを呼んだときには、通常「Fatal error: Call to undefined method *****::****()」のようなエラーが出力されますが、__callメソッドを定義しておくと、存在しないクラスのメソッドの代わりに__callメソッドが呼び出されます。これにより、存在しないクラスのメソッドが呼ばれたときの補完を行うことが可能になります。

   __callメソッドの引数は2つです。1つ目には呼び出されたメソッド名が格納され、2つめには呼び出した際の引数が配列として格納されます(リスト10)。

リスト10:call.php
<?
class Call
{
private $Value;

function __call( $Name, $Args )
{
echo "[".$Name."]method not exists!!\n";
print_r( $Args );
}

function Method3( $No1, $No2, $No3 )
{
echo "[Method3]method exists!!\n".
"[".$No1."][".$No2."][".$No3."]";
}
}

$Call = new Call( );

$Call->noMethod1( 1 );
$Call->noMethod2( 1, 2 );
$Call->Method3( 1, 2, 3 );

?>

   存在しないメンバー変数に対して代入を行おうとすると、代入時点で新たにメンバー変数が生成されますが、__setメソッドを定義しておくと、新たにメンバー変数を生成するのではなく、__setメソッドが呼び出されます。これにより、存在しないメンバー変数に対して代入しても、実際に存在しているメンバー変数へ代入させるよう制御できます。

   __setメソッドの引数は2つです。1つ目にはメンバー変数名が格納され、2つ目には代入しようとした内容が格納されます(リスト11)。

リスト11:set.php
<?
class Set
{
public $set;

function __set( $Name, $Value )
{
$this->set = $Value;
}
}

class noSet
{
public $noset;
}

$noSet = new noSet( );

$noSet->noSet1 = "123";
$noSet->noSet2 = "456";
$noSet->noSet3 = "789";
var_dump( $noSet );

$Set = new Set( );

$Set->noSet1 = "123";
$Set->noSet2 = "456";
$Set->noSet3 = "789";
var_dump( $Set );

?>

   存在しないメンバー変数を参照したとき、__getメソッドが定義されていると、それをオーバーライドすることができます。これにより、存在しないメンバー変数を参照しても、実は存在しているメンバー変数を参照させるように制御できます。

   __getメソッドの引数は1つで、参照しようとしたメンバー変数名が格納されます(リスト12)。

リスト12:get.php
<?
class Get
{
public $get = "Real Get!!\n";

function __get( $Name )
{
return $this->get;
}
}

$Get = new Get( );

echo $Get->NoGet1;

var_dump( $Get );

?>
1   2  次のページ



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


INDEX
Part1:PHP5のオブジェクト指向(3)
__call( )、__get( )、__set( )
  まとめ