次のように、メソッド内で $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
?>