Staticなメソッドを実行するときー


jQueryみたいに省略可能な関数の塊クラスを作りたかったので

静的メソッドを利用した場合の挙動についていろいろテストしてみた。

PHPのバージョンは、5.3.1

まとめると、

  • staticを指定してないメソッドは、静的メソッドの形式でも呼び出せる。
  • インスタンスから静的メソッドを呼び出すこともできる
  • ただし、クラスを変数で動的に指定してメソッドを呼び出すような場合、指定どおりの書き方じゃないとうまく動かない。
<?php 
class Tips
{
    // どの行の表示か見る用
    protected static $i = 1;
    // static じゃないメソッド
    public function echo_test($var)
    {
        echo $var . ': test '.self::$i++.'<br>';
    }
    // static なメソッド
    public static function echo_test_static($var)
    {
        echo $var . ': test '.self::$i++.'<br>';
    }
    protected $l = 0;
    public function echo_test_use_this($var)
    {
        echo $var . ': test '.self::$i.'<br>';
        $this->l++;
    }

}

$i = 0;
Tips::echo_test($i++); // OK
//Tips->echo_test($i++); // エラー
$F = new Tips();          
$F::echo_test($i++); // OK
$F::echo_test_static($i++); // OK
//$F::echo_test_use_this($i++); // エラー
$F->echo_test($i++); // OK
$F->echo_test_static($i++); // OK
$F->echo_test_use_this($i++); // OK

$C = 'Tips';
$C::echo_test($i++); // OK
$C::echo_test_static($i++); // OK
//$C::echo_test_static_use_this($i++); // エラー
//$C->echo_test(); // エラー
//$C->echo_test_static($i++); // エラー
//$C->echo_test_static_use_this($i++); // エラー

$A = 'F';
$$A->echo_test($i++); // OK
$$A->echo_test_static($i++); // OK
$$A->echo_test_use_this($i++); // OK
//$$A::echo_test(); // エラー
//$$A::echo_test_static(); // エラー
//$$A::echo_test_use_this($i++); // OK
?>