PHPのコネタ ― 2007年08月18日 04時10分33秒
脈絡もなくPHPネタ。いや、いろいろとすぐに忘れちゃうもんで。
スタティックメソッドチェーンて、できるのか?
まぁ、インスタンスアクセスをしないユーティリティクラスに対して値を設定するなんてことは普通しないワケなんだけど、何を思ったのか、スタティックメソッドでメソッドチェーンができないかを試してみた。
ま、実用性皆無のサンプルだけど、こんな感じのコードがあったとする。
/** * 単純なカウンタクラス */ class Counter { private static $_counter = 0; /** * 現在値の取得 */ public static function current() { return self::$_counter; } /** * カウンタを進める */ public static function increment() { self::$_counter++; } }見てのとおり、現在値の取得とカウンタのインクリメントをスタティックメソッドで提供している。で、これを
var_dump( Counter::increment() ); echo Counter::current();とかってすると、出力は
NULL 1見たいな感じになる。
で、本題。incrementメソッドを何も考えずに
public static function increment() { self::$_counter++; return self; }としてみる。「echo Counter::increment()::current();」とかってやってみたいわけ。記述は変態じみてるけど。
で、実行してみると、以下のようになる。
string(4) "self" 1キーワード「self」を戻り値にすると、"self"という文字列が返るみたいだ。なので当然「increment()::current()」はできませんでしたとさ。
call_user_funcのまとめ
よく忘れるのでメモ的にまとめる。
関数「call_user_func」は、第一引数に関数名、それ以降にその関数への引数を列挙することで動的な関数呼び出しを行う関数。
で、第一引数にはarrayを渡すこともでき、これによりメソッド呼び出しも行える。インスタンスメソッドもクラスメソッド(スタティックメソッド)も。
まとめるとこんな感じ。
- 関数呼び出し
-
- 呼び出したい関数名をstringで渡す。
- インスタンスメソッド呼び出し
-
- array渡し。arrayの第一要素にはメソッドを所有するインスタンス、第二要素にメソッド名をstringで渡す。
- クラスメソッド呼び出し
-
- array渡し。arrayの第一要素にはクラス名をstringで、第二要素にメソッド名をstringで渡す。
以下サンプル。ちなみにPHP5のコードなので注意。
<?php function func_test() { return '関数呼び出し'; } class TestClass { public function __construct() {} public function instanceMethod() { return 'インスタンスメソッド呼び出し'; } public static function staticMethod() { return 'クラスメソッド呼び出し'; } } // 「func_test()」と等価 echo call_user_func( 'func_test' ) . "\n"; // → "関数呼び出し" $test = new TestClass(); // 「$test->instanceMethod()」と等価 echo call_user_func( array( $test, 'instanceMethod' ) ) . "\n"; // → "インスタンスメソッド呼び出し" // 「TestClass::staticMethod()」と等価 echo call_user_func( array( 'TestClass', 'staticMethod' ) ) . "\n"; // → "クラスメソッド呼び出し"
コメント
トラックバック
このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/08/18/1732948/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。