2012-02-04 2 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-> что-то() Я хочу, чтобы вызвать этот метод неопределенный материал, так что я могу делать свою магию, а не что-то() ...

Есть ли способ, я могу обнаружить путь метод был вызван и выполнил метод, который я хочу?

пс: Я знаю, что я мог бы сделать это с помощью __callStatic и переименовывать что-то к чему-то еще, но мне было интересно, если есть лучшее решение, в котором я могу сохранить текущее статическое имя метода

ответ

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(); 

против

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

Если его второе, то я предложил бы просто сделать вас внутренний класс вызывает вызов другой метод, к которому также обращается внешний метод, например:

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

Если вы используете PHP 5.3 0,0 и выше, вы можете использовать callStatic магический метод, если вы используете более низкую версию, или вы хотите, чтобы быть совместимым, я боюсь, что вы должны будете использовать хак, как это:

static protected $calledStatic = false; 

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

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