PHP5.3.0 以降、__invoke マジックメソッドを使用することができるようになりました。クラスオブジェクトを 関数のように呼び出すことができるようになります。ここでは、そのサンプルコードを掲載しています。
スポンサーリンク
マジックメソッド __invoke サンプルコード
マジックメソッド __invoke の実装例になります。masao はいつまでたっても18歳クラスをサンプルに使用しています。
class invokeClass
{
private $_name; // 名前
private $_age; // 年齢
public function __construct($name, $age)
{
$this->_name = $name;
$this->_age = $age;
}
/**
* __invoke マジックメソッド
*/
public function __invoke()
{
// 名前と年齢を結合して返す
return $this->_name . '(' . $this->_age . ')';
}
}
// クラスオブジェクトの作成
$invoke = new invokeClass('masao', 18);
// クラスオブジェクトを関数のようにコールする
echo $invoke();
// __invoke マジックメソッドのアクセスレベルが public の場合は通常のメソッド呼び出しも可能
echo $invoke->__invoke();
// 出力結果
//---------------------------
// masao(18)
// masao(18)
//
ポイント
- __invoke メソッドを private や protected にしてもマジックメソッドの呼び出しは可能(通常のメソッド呼び出しは不可)
- __invoke メソッドは、引数(複数)をとることができ、デフォルトパラメータも設定可能
マジックメソッドを実装していない場合
マジックメソッドを実装していないクラスオブジェクトを関数コールのように呼び出すと、以下のように Fatal エラーが発生すします。
マジックメソッド __invoke サンプルコード
次に、マジックメソッド __toString を紹介します。 __toString マジックメソッドを実装することによって、オブジェクトを echo などで出力した際に任意の文字列を出力ことができるようになります。他の言語でも同じような機能はありますね。追いつけ・追い越せといったところでしょうか。
class toStringClass
{
private $_name; // 名前
private $_age; // 年齢
/**
* コンストラクタ
*/
public function __construct($name, $age)
{
$this->_name = $name;
$this->_age = $age;
}
/**
* __toString マジックメソッド
* @return <string>
*/
public function __toString()
{
// 名前と年齢を結合して返す
return $this->_name . '(' . $this->_age . ')';
}
}
// クラスオブジェクトの作成
$toString = new toStringClass('masao', 18);
// クラスオブジェクトを出力する
echo $toString;
print $toString;
// キャストすることでその内容を取り出すことも可能
$string = (string) $toString;
// 出力結果
//---------------------------
// masao(18)
// masao(18)
//
マジックメソッドを実装していない場合
__toString マジックメソッドを実装していないクラスオブジェクトを echo や print および すべての文字列コンテキスト (たとえば printf() における %s 修飾子) で出力させようとすると、以下のように、fatal エラーが発生します。( PHP 5.2.0 以降。PHP 5.2.0 以前では、echo または print でコールされた場合のみエラーが発生 )
Catchable fatal error: Object of class toStringClass could not be converted to string in ・・・