2009-07-20 14 views
29

私がチェックしたいのは、私が作成しているライブラリに静的な関数が存在するかどうかです。私は関数とmethod_existsを見てきましたが、相対的な文脈でそれらを呼び出す方法を見つけていません。ここでは、より良い例です:メソッドが静的クラスに存在するかどうかを調べる

class myClass{ 
    function test1() 
    { 
     if(method_exists("myClass", "test1")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test2() 
    { 
     if(method_exists($this, "test2")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test3() 
    { 
     if(method_exists(self, "test3")) 
     { 
      echo "Hi"; 
     } 
    } 
} 
// Echos Hi 
myClass::test1(); 
// Trys to use 'self' as a string instead of a constant 
myClass::test3(); 
// Echos Hi 
$obj = new myClass; 
$obj->test2(); 

私は関数が存在する場合は、静的文脈からそれを取るために必要とせず、こんにちはテスト3エコーを作ることができるようにする必要があります。 $ thisは割り当てられたクラスのため、クラスにアクセスするためのキーワードが 'self'でなければなりません。

+0

なぜtest1()メソッドでは十分ではありませんか? – gapple

+0

これを複数のクラスで拡張されるクラスに入れたいからです。私はこれを達成するために魔法の定数を使用することができますが、より簡単な方法があるはずです。 –

答えて

49

get_called_class()は、PHP 5.3で導入されました、そして "後期静的バインディング" クラス名を返します。

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_called_class(), "test")) 
     { 
       echo get_called_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // should print "subClass::test()" 

PHPの5.0.0のよう要求しないget_class()機能、クラス内で呼び出された場合は、その関数が宣言されたクラスの名前(親クラスなど)が返されます(例:親クラス)。

__CLASS__ magic constantは[link]と同じです。

class myClass{ 
    public static function test() 
    { 
     if(method_exists(__CLASS__, "test")) 
     { 
       echo __CLASS__.'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 
+0

ありがとうございます!それはまさに私が探していたものでした。 –

+0

私は静的メソッドが親クラスに存在するかどうかを調べる方法を探していました。この答えは、 'get_parent_class()'がパラメータなしで呼び出されたときと同じ方法で動作することを発見しました。ありがとう! – mopo922

1

更新:

ああ、お詫び申し上げます。私は一時的に盲目でした:)魔法の定数__CLASS__を使用したいと思います。

if (method_exists(__CLASS__, "test3")) { echo "Hi"; } 
+0

この回答は、クラス名が文字列として渡されたmethod_exists()を使用した質問サンプルのtest1()メソッドと同じようです。 – gapple

+0

アイデアは私がクラス名を必要としないため、クラスが割り当てられているかどうかにかかわらず、どのクラスでも動作するはずです。 –

+0

あなたは私が主な質問に載っているというコメントを意味しますか? –

関連する問題