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();
}
}
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();
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()
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
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.