2012-02-04 42 views
-1

例如这个类中的方法:确定如果我打电话的对象上下文

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 ::东西()我想要的东西()方法来运行(就像现在)。

但如果我调用$ A->东西()我想触发未定义的方法的东西,所以我可以做我的魔,不是()...

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

PS:我知道我可以这样使用__callStatic和重新命名一些别的东西做的,但我不知道是否有更好的解决方案中,我可以的,如果你正在使用PHP 5.3保持当前的静态方法名

回答

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.0和更高的可使用callStatic魔术方法,如果你使用较低的版本,或者您希望它是兼容的,我怕你会需要破解使用这样的:

static protected $calledStatic = false; 

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

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