web-dev-qa-db-fra.com

Vérifiez si la méthode existe dans la même classe

Ainsi, method_exists() nécessite un objet pour voir si une méthode existe. Mais je veux savoir si une méthode existe au sein de la même classe.

J'ai une méthode qui traite certaines informations et peut recevoir une action, qui exécute une méthode pour poursuivre le traitement de ces informations. Je veux vérifier si la méthode existe avant de l'appeler. Comment puis-je y parvenir?

Exemple:

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

Vous pouvez faire quelque chose comme ça:

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

En utilisant method_exists est correct. Cependant, si vous souhaitez vous conformer au "principe de ségrégation d'interface", vous allez créer une interface pour effectuer une introspection, comme ceci:

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() accepte un nom de classe ou une instance d'objet comme paramètre. Vous pouvez donc vérifier par rapport à $this

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

Paramètres

objet Une instance d'objet ou un nom de classe

nom_méthode Le nom de la méthode

5
Calimero

La meilleure façon à mon avis est d'utiliser la méthode magique __call.

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

Oui, vous pouvez utiliser method_exists ($ this ...) mais c'est la méthode interne PHP.

3
Jeliu Jelev