2012-09-26 13 views
8

PHP 5.4.5 के अंदर किसी सदस्य चर के __invoke विधि को कैसे कॉल करें। मैं किसी ऑब्जेक्ट को आमंत्रित करने की कोशिश कर रहा हूं जिसे किसी अन्य ऑब्जेक्ट के सदस्य के रूप में संग्रहीत किया जाता है। इस तरह (बहुत मोटे तौर पर)कक्षा

class A { 
    function __invoke() { ... } 
} 

class B { 
    private a = new A(); 
... 
    $this->a(); <-- runtime error here 
} 

यह रनटाइम त्रुटि उत्पन्न करता है, बेशक, क्योंकि कोई विधि नहीं है। लेकिन अगर मैं इस तरह की कॉल लिखता हूं:

($this->a)(); 

तो मुझे एक वाक्यविन्यास त्रुटि मिलती है।

बेशक

, मैं

$this->a->__invoke(); 

लिख सकते हैं लेकिन यह है कि असह्य रूप में बदसूरत लगता है, और नहीं बल्कि functors की बात को नजरअंदाज। मैं बस सोच रहा था कि कोई बेहतर (या आधिकारिक) तरीका है या नहीं।

सीधे बुला __invoke, जो आप पहले ही उल्लेख किया:

उत्तर

8
वहाँ

तीन तरीके है

$this->a->__invoke(); 

एक चर को बताए द्वारा:

$a = $this->a; 
$a(); 

call_user_func का उपयोग करके:

call_user_func($this->a); 

आखिरी वाला शायद वह है जिसे आप ढूंढ रहे हैं। इसका लाभ यह है कि यह किसी भी कॉल करने योग्य के साथ काम करता है।

+1

धन्यवाद इगोर। तीनों में से, चर के लिए असाइनमेंट सबसे स्पष्ट जैसा लगता है, लेकिन उनमें से कोई भी बहुत अच्छा नहीं है। क्या कोई समझता है कि क्यों 'स्पष्ट' वाक्यविन्यास $-> a() को सदस्य की __invoke विधि नहीं मिल सकती है - क्यों सदस्य सदस्य मूल रूप से नग्न परिवर्तनीय वाक्यविन्यास के लिए अलग है ?? –

+1

क्योंकि यह संदिग्ध है। '$ this-> a()' या तो विधि 'ए' या सदस्य '$ a' हो सकता है। PHP में उन दोनों को काफी दृढ़ता से अलग किया गया है (उदाहरण के लिए जेएस के विपरीत)। – igorw

+0

आह। यह समझ आता है। धन्यवाद। –

3

मैं जानता हूँ कि यह एक देर से जवाब है, लेकिन उपवर्ग में माता पिता और __invoke() में __call() का एक संयोजन का उपयोग करें:

class A { 
    function __invoke ($msg) { 
    print $msg; 
    } 
} 

class B { 
    private $a; 

    public function __construct() { $this->a = new A(); } 

    function __call($name, $args) 
    { 
     if (property_exists($this, $name)) 
     { 
     $prop = $this->$name; 
     if (is_callable($prop)) 
     { 
      return call_user_func_array($prop, $args); 
     } 
     } 
    } 
} 

तो फिर तुम वाक्यात्मक चीनी आप कर रहे हैं प्राप्त करने के लिए सक्षम होना चाहिए की तलाश में:

$b = new B(); 
$b->a("Hello World\n"); 
+0

यह काफी साफ दृष्टिकोण है। धन्यवाद। –

2

FYI करें PHP में 7+ एक ऑब्जेक्ट के अंदर एक कॉलबैक के आसपास कोष्ठक अब काम करता है:

class foo {                  
    public function __construct() {            
     $this -> bar = function() {            
      echo "bar!" . PHP_EOL;            
     };                  
    }                   

    public function __invoke() {             
     echo "invoke!" . PHP_EOL;            
    }                   
}                    

(new foo)();                  

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

परिणाम:

invoke! 
bar!