静的にも動的にも呼び出し可能なメソッドを定義する

次のように、メソッド内で $this の存在を empty() ないし isset でチェックすることで、エラーになることなく static かインスタンスメソッド呼び出しかで動作を分けることができます。
(PHP4.4 / 5.1 にて動作確認済)

<?php
class Foo{
  var $mes;
  // コンストラクタ
  function Foo($mes){
    $this->mes = $mes;
  }
  // クラスメソッド兼インスタンスメソッド
  function greet($mes = false){
    if(!$mes && !empty($this) ){
      // インスタンスが存在する。
      $mes = $this->mes;
    }else{
      // static 呼び出し。
    }
    echo ($mes?$mes:’empty’).”\n”;
  }
}
error_reporting(E_ALL);
$o = new Foo(‘hello’);
$o->greet(); // 結果: hello
 
Foo::greet(‘static hello’); // 結果: static hello
Foo::greet(); // 結果 empty
 
?>