功能存在

时间:2013-01-16 08:08:00

标签: php oop

好的,我的MVC很像

somesite /类名/ classfunction /功能

class test(){
  public function test2(){
    // action will be 'function' in adress
    $action = $this->action ? $this->action : array($this, 'test3');
    function test3(){
      print 1;
    }
    $action();
  }
}

因此,如果我们运行somesite/test/test2/test3,它将打印'1',但如果我们运行somesite/test/test2/phpinfo,它将显示phpinfo。
问题:如何在类函数中检查函数的存在?

UPD
不要忘记phpinfo,function_exists会显示它。 method_exists在类函数中搜索,但不在类函数的函数中搜索 UPD 解决方案

class test{
    public function test2(){
    // site/test/test2/test3
        $tmpAction = $this->parenter->actions[1]; // test3  
        $test3 = function(){
            print 1;
        };
        if(isset($$tmpAction)){
            $$tmpAction();
        }else{
            $this->someDafaultFunc();
        }
    }
}

3 个答案:

答案 0 :(得分:2)

http://php.net/function-exists

http://php.net/method-exists

if ( function_exists('function_name') ) {
    // do something
}

if ( method_exists($obj, 'method_name') ) { /* */ }

您还应该查看魔术方法__call()

答案 1 :(得分:2)

要检查某个类中是否存在某个方法,请使用:http://php.net/method-exists

   $c = new SomeClass();
   if (method_exists($c, "someMethod")) {
       $c->someMethod();
   }

您也可以使用班级名称:

   if (method_exists("SomeClass", "someMethod")) {
       $c = new SomeClass();
       $c->someMethod();
   }

To" fix"你的问题,让test3()成为一种类方法:

class test(){
  private function test3() {
      print 1;
  }
  public function test2(){
    // action will be 'function' in adress
    $action = $this->action ? $this->action : array($this, 'test3');

    if (method_exists($this, $action)) {
        $this->$action();
    } else {
        echo "Hey, you cannot call that!";
    }
  }
}

答案 2 :(得分:2)

class test{
    public function test2(){
    // site/test/test2/test3
        $tmpAction = $this->parenter->actions[1]; // test3  
        $test3 = function(){
            print 1;
        };
        if(isset($$tmpAction)){
            $$tmpAction();
        }else{
            $this->someDafaultFunc();
        }
    }
}