したがって、method_exists()
は、メソッドが存在するかどうかを確認するオブジェクトを必要とします。しかし、同じクラス内からメソッドが存在するかどうかを知りたいです。
何らかの情報を処理し、その情報をさらに処理するメソッドを実行するアクションを受信できるメソッドがあります。メソッドを呼び出す前に存在するかどうかを確認したい。どうすれば達成できますか?
例:
class Foo{
public function bar($info, $action = null){
//Process Info
$this->$action();
}
}
次のようなことができます:
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();
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()
method_exists()
は、パラメータとしてクラス名またはオブジェクトインスタンスのいずれかを受け入れます。したがって、$this
http://php.net/manual/en/function.method-exists.php
パラメータ¶
objectオブジェクトインスタンスまたはクラス名
method_nameメソッド名
私の意見では、__ callマジックメソッドを使用するのが最善の方法です。
public function __call($name, $arguments)
{
throw new Exception("Method {$name} is not supported.");
}
はい、method_exists($ this ...)を使用できますが、これは内部のPHPの方法です。