PHPのコネタ
2007-08-18


脈絡もなく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を渡すこともでき、これによりメソッド呼び出しも行える。インスタンスメソッドもクラスメソッド(スタティックメソッド)も。

まとめるとこんな感じ。

以下サンプル。ちなみに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";
// → "クラスメソッド呼び出し"
[PHP]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット