确定我是否在对象上下文中调用了一个方法

时间:2012-02-04 19:02:18

标签: php class magic-methods

例如这个类:

class A{

  public function __call($func, $args){
    if($func == 'something')
      call_user_func_array($this->_some_magic, $args);
  }

  public function _some_magic(){
    ...
  }

  public static function something(){
    ...
  }

}

现在如果我调用$ a :: something()我想要运行something()方法(就像现在一样)。

但如果我打电话给$ a-> something()我想触发那些未定义的方法,所以我可以做我的魔法,而不是某些东西()......

有什么方法可以检测方法被调用的方式并执行我想要的方法吗?

ps:我知道我可以使用__callstatic并将某些内容重命名为其他内容,但我想知道是否有更好的解决方案,我可以保留当前的静态方法名称

2 个答案:

答案 0 :(得分:2)

请参阅   - __call http://www.php.net/manual/en/language.oop5.overloading.php#object.call   - __callStatic http://www.php.net/manual/en/language.oop5.overloading.php#object.callstatic

或者你在谈论确定它是否是外部呼叫,例如:

$a = new A();
$a->doSomething();

VS

class A {
    public function doSomething() {}
    public function callDoSomething() { $this->doSomething(); }
}

如果是后一种情况,那么我建议简单地让内部类调用调用外部方法调用也路由到的另一种方法,例如:

class A {
    public function doSomething() { $this->_doSomething(); }
    public function callDoSomething() { $this->_doSomething(); }
}

答案 1 :(得分:1)

如果您使用的是php 5.3.0及更高版本,则可以使用callStatic魔术方法,如果您使用的是较低版本或者您希望它兼容,我恐怕您需要使用hack之类的这样:

static protected $calledStatic = false;

public function __call( $func, $args){
  if( self::$calledStatic){
     ...
     self::$calledStatic = false;
  }
}

public static function something(){
  self::$calledStatic = true;
}