2013-07-15 20 views
10

PHPの子クラスによってメソッドがオーバーライドされているかどうかチェックできますか?php子クラスでメソッドがオーバーライドされているかどうかを調べる

<!-- language: lang-php --> 

class foo { 
    protected $url; 
    protected $name; 
    protected $id; 

    var $baz; 

    function __construct($name, $id, $url) { 
     $this->name = $name; 
     $this->id = $id; 
     $this->url = $url; 
    } 

    function createTable($data) { 
     // do default actions 
    } 
} 

子供クラス:

class bar extends foo { 
    public $goo; 

    public function createTable($data) { 
     // different code here 
    } 
} 

このクラスのメンバとして定義されたオブジェクトの配列を反復処理するとき、どのように私は古いものとは対照的に、新しいメソッドを持つオブジェクトのどの確認することができますか? method_overridden(mixed $object, string $method name)のような機能はありますか?

foreach ($objects as $ob) { 
    if (method_overridden($ob, "createTable")) { 
     // stuff that should only happen if this method is overridden 
    } 
    $ob->createTable($dataset); 
} 

私はtemplate method patternを認識していますが、のは、私はプログラムの制御は、クラスやメソッドそのものとは別のようにしたいとしましょう。これを達成するには、method_overriddenのような関数が必要です。

+0

、またはオーバーライドされましたか?私はPHPがメソッドオーバーロードを持っていないと思った –

+0

私はover-riddenを意味した、はい – Joey

+1

あなたはこれを試すことができる:http://www.php.net/manual/en/reflectionclass.hasmethod.php –

答えて

16

チェック宣言クラスは、オブジェクトのクラスと一致した場合:

$reflector = new \ReflectionMethod($ob, 'createTable'); 
$isProto = ($reflector->getDeclaringClass()->getName() !== get_class($ob)); 
オーバーロード
+0

これは確かに私がやりたいことですが、質問があります:ReflectionMethodの前にどのような理由で名前空間演算子を使用していますか?よりローカルスコープで定義された同じ名前のメソッドを誤って呼び出すのではなく、グローバル名前空間からメソッドが確実に呼び出されるようにするかどうかです。 – Joey

+3

あなたの場合はおそらく必要ありません。上記のコードが名前空間の下にある場合は、ReflectionMethodクラスをインポートするか、グローバル名前空間接頭辞( '\\')でアクセスする必要があります。私はちょうどこの状況が処理されていることを確認しています:) –

2

この情報を取得するには、ReflectionClassを使用する必要があります。 getMethodを試して、メソッドのクラス名を確認することができます。

$class = new ReflectionClass($this); 
$method = $class->getMethod("yourMethod"); 
if ($method->class == 'classname') { 
    //.. do something 
} 

しかし、反射はあまり速くないので、使用には注意してください。

+0

PHP 5.5.20では、 '$ method ['class']'は私に:_ ReflectionMethod型のオブジェクトをarray_として使用できませんでした。 '$ method-> class'はうまくいきました。 –

+0

ありがとう - 私はそれを変更しました – Philipp

関連する問題