2015-11-26 23 views
6

したがって、method_exists()ではメソッドが存在するかどうかを確認するオブジェクトが必要です。しかし、同じクラスの中からメソッドが存在するかどうかを知りたい。メソッドが同じクラスに存在するかどうかをチェック

私はいくつかの情報を処理し、その情報をさらに処理する方法を実行するアクションを受け取ることができるメソッドを持っています。メソッドを呼び出す前にメソッドが存在するかどうかを確認したい。どうすれば達成できますか?

例:

class Foo{ 
    public function bar($info, $action = null){ 
     //Process Info 
     $this->$action(); 
    } 
} 
+0

以下の回答は問題ありません。追加の発言:メソッドが存在するかどうかを知る必要がありますか?このような状況は、親クラスから継承したメソッドがある場合、または現在のクラスが継承しているものが不明な場合に発生します。どちらの場合も、インタフェースまたは抽象メソッド定義を使用して処理できます。これは、より透過的で、ランタイムからコンパイル時にエラーを移動させるので、望ましいものです。 – arkascha

+0

公開されている他のメソッドをさらに処理して処理したデータを返すので、最初のメソッドは返されません。処理する必要があり、何も返す必要がないデータを受け取ることができるからです。しかし、必要に応じて他のメソッドをfisrtメソッドから呼び出すのは時間が節約されると思っていましたが、それでもそれらを別々に呼び出すことは可能です。 – Rafael

+0

しかし、クラスそのものの中に、メソッドが存在するかどうかが不明な理由は何ですか?私はそれがクラスで宣言されているか実装されているか、そうではないということです。どのように、なぜそれが実行時に変更されるべきですか?私は方法が存在するかどうかを正確に知っていると言いたい。 – arkascha

答えて

21

あなたはこのような何かを行うことができます。

class A{ 
    public function foo(){ 
     echo "foo"; 
    } 

    public function bar(){ 
     if(method_exists($this, 'foo')){ 
      echo "method exists"; 
     }else{ 
      echo "method does not exist"; 
     } 
    } 
} 

$obj = new A; 
$obj->bar(); 
2

method_exists()パラメータとして、クラス名またはオブジェクトのインスタンスのいずれかを受け付けます。だから、$this

http://php.net/manual/en/function.method-exists.php

パラメータ

¶オブジェクト オブジェクトインスタンスまたはクラス名

METHOD_NAME メソッド名

に対してチェックすることができます
+0

私は、あなたが言ったことをサポートするためのマニュアルへのリンクを私に与えたと思うが、マニュアルにはOBJECTが必要だと言われている。私はあなたが言ったことを一瞬で試してみる... – Rafael

+0

あなたのために上の興味深い部分を強調する – Calimero

+0

ああ、(地面に)、申し訳ありません= p – Rafael

7

method_existsが正しい使い方。

class A 
{ 
    public function doA() 
    { 
     if ($this instanceof X) { 
      $this->doX(); 
     } 

     // statement 
    } 
} 

interface X 
{ 
    public function doX(); 
} 

class B extends A implements X 
{ 
    public function doX() 
    { 
     // statement 
    } 
} 

$a = new A(); 
$a->doA(); 
// Does A::doA() only 

$b = new B(); 
$b->doA(); 
// Does B::doX(), then remainder of A::doA() 
+1

WTF ?????私はまだxDを学ぶことがたくさんあることがわかる – Rafael

+0

@RafaelあなたはOOPを愛していないのですか? – Flosculus

+2

私は始めましたが、あなたはそれを殺しました@Flosculus – Rafael

1

私の意見では最良の方法は__call魔法の方法を使用することです:あなたは、「インターフェイスの棲み分け原理」に準拠するようにしたい場合は、あなたがそうのように、反対イントロスペクションを実行するためのインタフェースを作成します。

public function __call($name, $arguments) 
{ 
    throw new Exception("Method {$name} is not supported."); 
} 

はい、method_exists($ this ...)を使用できますが、これはPHP内部の方法です。

関連する問題