web-dev-qa-db-ja.com

メソッドが同じクラスに存在するかどうかを確認してください

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

何らかの情報を処理し、その情報をさらに処理するメソッドを実行するアクションを受信できるメソッドがあります。メソッドを呼び出す前に存在するかどうかを確認したい。どうすれば達成できますか?

例:

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

次のようなことができます:

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();
43
Rajdeep Paul

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()
10
Flosculus

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

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

パラメータ

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

method_nameメソッド名

5
Calimero

私の意見では、__ callマジックメソッドを使用するのが最善の方法です。

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

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

3
Jeliu Jelev