2010-07-13 9 views
21

मैं यह जानने का प्रयास कर रहा हूं कि PHP में ऑब्जेक्ट पर किसी भी विधि को कैसे पकड़ा जाए। मैं जादू कार्य __call के बारे में जानता हूं, लेकिन यह केवल उन विधियों के लिए ट्रिगर किया गया है जो बुलाए गए ऑब्जेक्ट पर मौजूद नहीं हैं।PHP में ऑब्जेक्ट पर किसी भी विधि कॉल को कैसे पकड़ें?

उदाहरण के लिए मैं कुछ इस तरह है:

class Foo 
{ 
    public function bar() 
    { 
    echo 'foobar'; 
    } 

    public function override($method_name,$method_args) 
    { 
    echo 'Calling method ',$method_name,'<br />'; 
    $this->$method_name($method_args); //dirty, but working 
    } 
} 

और जब मैं ऐसा करते हैं:

Calling method bar 
foobar 
इस एक के बजाय

:

$foo = new Foo(); 
$foo->bar(); 

मैं इस उत्पादन चाहते

foobar 

क्या ऐसा कोई तरीका है? मदद :) कृपया

उत्तर

38

लेते हुए अपने मूल Foo कार्यान्वयन आप इस तरह के चारों ओर एक decorator लपेट सकता है:

class Foo 
{ 
    public function bar() { 
     echo 'foobar'; 
    } 
} 

class Decorator 
{ 
    protected $foo; 

    public function __construct(Foo $foo) { 
     $this->foo = $foo; 
    } 

    public function __call($method_name, $args) { 
     echo 'Calling method ',$method_name,'<br />'; 
     return call_user_func_array(array($this->foo, $method_name), $args); 
    } 
} 

$foo = new Decorator(new Foo()); 
$foo->bar(); 
+0

धन्यवाद दोस्त, thats वास्तव में क्या मैं :) – Pirozek

+0

ही एक मामला जरूरत है, जहां यह काम नहीं करेगा आप तरीकों कि उम्मीद 'Foo' है, जैसे' someMethod (फू $ foo) है ' –

2

आप वस्तु के आसपास एक वस्तु लपेट कर सकते हैं, किसी भी कॉल में अवरोध उत्पन्न कर तो मूल वस्तु पर उन्हें अग्रेषण और परिणाम लौटने।

बस अपने आवरण कक्षा में एक चर के रूप में वस्तु की दुकान और अपने आवरण कक्षा में अधिक भार तरीकों का उपयोग कॉल करने के लिए/सेट/प्राप्त/वस्तु पर जाँच करें।

$object = new AnyObject; 
$object = new Wrapper($object); 

$object->anyMethod(); 
$object->anyVar = 'test'; 
echo $object->anyVar; 
echo $object['array form']; 

फॉर्च में रैपर वर्ग को लूप करना संभवतः कठिन है। हैवेन्ट ने कोशिश की।

+0

आप अधिक विशिष्ट कृपया हो सकता है? बस एक छोटा सा उदाहरण :) – Pirozek

+0

धन्यवाद दोस्त, इससे मेरी मदद की। – Pirozek