method_exists() があることは知っていますが、そのメソッドが継承されている場合でも true と表示されます。
class A
{
public function eix()
{
}
}
class B extends A
{
}
echo method_exists ('B', 'eix');
それは本当ですが、Bクラスにはありません。これをかわす方法は?
これを実現するには、リフレクションを使用する必要があります。クラスをReflectionMethod
調べると、メソッドが見つかりますgetDeclaringClass
。
$classname = 'B';
$methodname = 'eix';
$method = new ReflectionMethod($classname, $methodname);
$declaringclass = $method->getDeclaringClass();
if ($classname == $declaringclass->name) {
// method was defined on the original class
}
とはいえ、重要な点は、 classにはmethod があるということです。これは、再定義されていないすべての のメソッドをB
継承eix
するためです。A
メソッドが定義された場所を知る必要がある状況を完全に解決することはできませんが、この手法を使用すると、必要に応じてそれを行うことができます。
get_parent_class ()を使用して親を識別し、それに対して method_exists() を使用します。
echo method_exists (get_parent_class('B'), 'eix');
クラスBはクラスAを拡張するため、そのすべてのメソッドが固有であり、method_exists()
常にtrueを返します。
質問は、メソッドが最初にクラスAで作成されたのかクラスBで作成されたのかを知る必要がある理由です。この情報が必要になる理由はわかりません。
そして、これが問題になる場合は、おそらく最初からアーキテクチャ設計を再検討する必要があります。
しかし、Mark Bakerが説明しているように、少なくともメソッドが親クラスにも存在するかどうかを知ることができるかもしれませんが、必ずしも子クラスでオーバーライドされていないことを意味するわけではありません。
if(method_exists(get_parent_class('B'), 'eix'))
{
//Exist in parent class and was not first created in this.
//But still is inherent to this.
}
else
{
//Doesn't exist in parent and must been created in this.
}