2010-12-21 2 views
2

PHP 5.3でこの静的 '継承'に少し問題がある 静的関数が静的クラスに存在するかどうかをテストする必要がありますが、親静的クラスの内部からテストする必要があります。php5.3静的継承に関する助けが必要

私は 'static'キーワードを使って、 'this'キーワードをシミュレートすることができます。 関数が存在するかどうかをテストする方法が見つかりません。ここで

は一例です:

// parent class 
class A{ 

// class B will be extending it and may or may not have 
// static function name 'func' 
// i need to test for it 

    public static function parse(array $a){ 
     if(function_exists(array(static, 'func'){ 
      static::func($a); 
     } 
    } 
} 

class B extends A { 
    public static function func(array $a){ 
     // does something 
    } 
} 

は、だから今はB::parse(); アイデアは 、サブクラスが機能を持っている場合、それが使用されることを、それ以外の場合は使用されませんですが、実行する必要があります。

私が試した:

function_exists(static::func){} 
isset(static::func){} 

をこれらの2が動作しません。

どのようにすればいいですか? ところで、私は回避策としてラムダ関数を渡す可能性について知っていますが、これは私の状況では オプションではありません。

私はちょうど今考えることができない非常に単純な解決策があると感じています。

今、私は

public static function parse(array $a){ 
    if(function_exists(array(get_called_class(), 'func') { 
/*...*/ 
を試してみてください

答えて

2

を参照してください。 method_existsまたはis_callableを使用する必要があります。 issetは変数でのみ動作します。また、static$thisをシミュレートしませんが、2つの全く異なるものです。言われていること

、その特定の場合には、あなたが引用されstaticキーワードでis_callableを使用する必要があります。

if (is_callable(array('static', 'func'))) { 
    static::func(); 
} 

か...

if (is_callable('static::func')) { 
    static::func(); 
} 
+0

is_callable(配列( '静的'、 ' func '))は正常に動作しました。私は、もし 'func'が存在しなければ、is_callableは少なくとも変数が定義されていないという警告を出すかもしれないと心配しましたが、そうではありません。 func関数が存在しない場合はfalseを返します。これは正常です。 – Dmitri

0

を呼び出す必要があるあなたは、クラスとオブジェクト(メソッド)、のみの機能にfunction_existsを使用することはできませんhttp://php.net/get_called_class