2009-07-01 10 views
15

PHP documentation कहते __call() जादू विधि के बारे में निम्नलिखित:PHP में __call() ट्रिगर जब भी विधि मौजूद है

__call() जब एक वस्तु के संदर्भ में दुर्गम तरीकों लागू शुरू हो रहा है।

क्या कोई तरीका है कि मेरे पास __call() हो सकता है, जब भी कोई विधि मौजूद हो, वास्तविक विधि कहने से पहले? या, क्या कोई अन्य हुक है जिसे मैं कार्यान्वित कर सकता हूं या कोई अन्य तरीका जो इस कार्यक्षमता को प्रदान करेगा?

यदि यह महत्वपूर्ण है, तो यह static function के लिए है (और मैं वास्तव में __callStatic का उपयोग करना पसंद करूंगा)।

+0

भी देखें: http://stackoverflow.com/questions/3241949/how-to-catch- किसी भी विधि-कॉल-ऑन-ऑब्जेक्ट-इन-php – Benubird

उत्तर

11

बस अपने सभी अन्य तरीकों को सुरक्षित करने के बारे में, और उन्हें __callStatic के माध्यम से प्रॉक्सी कैसे करें?

namespace test\foo; 

class A 
{ 
    public static function __callStatic($method, $args) 
    { 
     echo __METHOD__ . "\n"; 

     return call_user_func_array(__CLASS__ . '::' . $method, $args); 
    } 

    protected static function foo() 
    { 
     echo __METHOD__ . "\n"; 
    } 
} 

A::foo(); 
+0

मुझे यह पसंद है। जब मैं PHP 5.3 में अपग्रेड करता हूं तो मैं इसे ध्यान में रखूंगा। धन्यवाद। –

19

क्यों सिर्फ अपने सभी तरीकों संरक्षित नहीं और __call का उपयोग कर() उन्हें फोन:

class bar{ 
    public function __call($method, $args){ 
     echo "calling $method"; 
     //do other stuff 
     //possibly do method_exists check 
     return call_user_func_array(array($this, $method), $args); 
    } 
    protected function foo($arg){ 
     return $arg; 
    } 
} 

$bar = new bar; 
$bar->foo("baz"); //echo's 'calling foo' and returns 'baz' 
+0

यह सही है :) – nXqd

+0

की आवश्यकता है (method_exists ($ यह, $ विधि)) { – zloctb

+0

मुझे लगता है कि सभी संरक्षित विधियां संरचना में एक अच्छा अराजकता बनाती हैं। विधि सार्वजनिक है या नहीं, यह जांचने के साथ '__call' का उपयोग करना बेहतर है। –

संबंधित मुद्दे