マジックメソッドを巡る旅 その11
- 編集部の見解や意向と異なる内容の場合があります
- 編集部は内容について正確性を保証できません
- 画像が表示されない場合、編集部では対応できません
- 内容の追加・修正も編集部では対応できません
ヒューマンリソシア株式会社はコラム「マジックメソッドを巡る旅 その11」を公開しました。
旅の最後は、「__get(), __set(), __call(), __callStatic()」で〆とさせていただければ、と思います。
まずは、__callと__callStaticから。
端的には、この2つのマジックメソッドは「存在しないメソッドが呼ばれた時に動きます」。
相変わらず、さくっとサンプルを書いてみましょう。
まずはごく当たり前の「動かない」サンプルを。
class hoge {
}
//
$obj = new hoge();
$obj->foo();
「Fatal error: Call to undefined method hoge::foo() 」って怒られましたそりゃそうですね。
では、ここにマジックメソッドを追加してみましょう。
class hoge {
//
public function __call($func, $args) {
echo “call function name is {$func}\n”;
}
}
//
$obj = new hoge();
$obj->foo();
エラーは出ずに、__callが呼ばれて中の処理が動きました。
同じように、静的なコンテキストも見てみましょう。
class hoge {
}
//
hoge::foo();
ここでのエラーから
class hoge {
//
public static function __callStatic($func, $args) {
echo “call static function name is {$func}\n”;
}
}
//
hoge::foo();
での挙動までが、一式確認できます。
ちなみに、混ぜてもちゃんと、予想通りの動きをしますのでご確認ください。
class hoge {
//
public function __call($func, $args) {
echo “call function name is {$func}\n”;
}
public static function __callStatic($func, $args) {
echo “call static function name is {$func}\n”;
}
}
//
hoge::foo();
//
$obj = new hoge();
$obj->foo();
また「__callだけ宣言しておいて__callStatic宣言しなくても、
都合良く静的なメソッド呼び出しで__callを呼び出してくれる」かというとそんなことありません、
というあたりは、この辺のコードで確認をしてみてください。
この続きは以下をご覧ください
http://resocia.jp/column/2125/
ソーシャルもやってます!