检查方法是否存在于同一个 class
Check if method exists in the same class
因此,method_exists()
需要一个对象来查看方法是否存在。但是我想知道同一个 class.
中是否存在一个方法
我有一个方法可以处理一些信息并可以接收一个操作,该方法运行一个方法来进一步处理该信息。我想在调用它之前检查该方法是否存在。我怎样才能实现它?
示例:
class Foo{
public function bar($info, $action = null){
//Process Info
$this->$action();
}
}
method_exists()
接受 class 名称或对象实例作为参数。所以你可以检查 $this
http://php.net/manual/en/function.method-exists.php
Parameters ¶
object
An object instance or a class name
method_name
The method name
你可以这样做:
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
是正确的。然而,如果你想符合 "Interface Segregation Principle",你将创建一个接口来执行内省,如下所示:
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()
我认为最好的方法是使用__call魔术方法。
public function __call($name, $arguments)
{
throw new Exception("Method {$name} is not supported.");
}
是的,您可以使用 method_exists($this ...) 但这是内部 PHP 方式。
因此,method_exists()
需要一个对象来查看方法是否存在。但是我想知道同一个 class.
我有一个方法可以处理一些信息并可以接收一个操作,该方法运行一个方法来进一步处理该信息。我想在调用它之前检查该方法是否存在。我怎样才能实现它?
示例:
class Foo{
public function bar($info, $action = null){
//Process Info
$this->$action();
}
}
method_exists()
接受 class 名称或对象实例作为参数。所以你可以检查 $this
http://php.net/manual/en/function.method-exists.php
Parameters ¶
object An object instance or a class name
method_name The method name
你可以这样做:
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
是正确的。然而,如果你想符合 "Interface Segregation Principle",你将创建一个接口来执行内省,如下所示:
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()
我认为最好的方法是使用__call魔术方法。
public function __call($name, $arguments)
{
throw new Exception("Method {$name} is not supported.");
}
是的,您可以使用 method_exists($this ...) 但这是内部 PHP 方式。