2010-11-26 16 views
18

के भीतर call_user_func के साथ एक उदाहरण विधि को कॉल करें, मैं उसी ऑब्जेक्ट की दूसरी विधि से विधि को कॉल करने के लिए call_user_func का उपयोग करने का प्रयास कर रहा हूं, उदा।PHP उसी कक्षा

class MyClass 
{ 
    public function __construct() 
    { 
     $this->foo('bar'); 
    } 
    public function foo($method) 
    { 
     return call_user_func(array($this, $method), 'Hello World'); 
    } 

    public function bar($message) 
    { 
     echo $message; 
    } 
} 

new MyClass; लौट चाहिए 'नमस्ते विश्व' ...

किसी को भी इस लक्ष्य को हासिल करने का सही तरीका पता है?

बहुत धन्यवाद!

+1

सही के बारे में लगता है। क्या काम नहीं करता है? –

+1

[वापसी] (http://de.php.net/manual/en/function.return.php) ने PHP में अर्थ परिभाषित किया है और यदि आप किसी और चीज को रेफर कर रहे हैं, तो आपको इसे स्पष्ट करना चाहिए। – Gordon

उत्तर

21

आपके द्वारा पोस्ट किया गया कोड ठीक काम करना चाहिए। एक वैकल्पिक "variable functions" इस तरह उपयोग करने के लिए होगा:

public function foo($method) 
{ 
    //safety first - you might not need this if the $method 
    //parameter is tightly controlled.... 
    if (method_exists($this, $method)) 
    { 
     return $this->$method('Hello World'); 
    } 
    else 
    { 
     //oh dear - handle this situation in whatever way 
     //is appropriate 
     return null; 
    } 
} 
+1

यह 'call_user_func' का उपयोग करने से भी तेज़ है, हालांकि मैंने इसे इस तरह से करने पर कई फ्राउन देखा है ... मैं उनमें से एक नहीं हूं :-) – prodigitalson

+0

यह उन लोगों में से एक है जिनकी बड़ी शक्ति बड़ी जिम्मेदारी है। मुहावरे। .. अच्छाई के लिए इसका इस्तेमाल करें, बुराई नहीं :) –

+3

मैं इस पर थोड़ा फहराऊंगा क्योंकि विधि मौजूद नहीं है, लेकिन यह संभवतः सुरक्षित है कि चेक कहीं और किया जाता है –

10

यह मेरे लिए काम करता है:

<?php 
class MyClass 
{ 
    public function __construct() 
    { 
     $this->foo('bar'); 
    } 
    public function foo($method) 
    { 
     return call_user_func(array($this, $method), 'Hello World'); 
    } 

    public function bar($message) 
    { 
     echo $message; 
    } 
} 

$mc = new MyClass(); 
?> 

यह बाहर प्रिंट हो:

wraith:Downloads mwilliamson$ php userfunc_test.php 
    Hello World 
+0

धन्यवाद, मैं इसे एक और जाने दूंगा, जब मैंने मूल रूप से कोशिश की तो मुझे एक त्रुटि होनी चाहिए! – Fred

2

नई MyClass; 'हैलो वर्ल्ड' वापस करना चाहिए ...

एक निर्माता कुछ भी वापस नहीं करता है।

+2

मुझे लगता है कि "वापसी" का अर्थ यहां बहुत ढीले अर्थ में है (पढ़ें: उसका मतलब है 'echo')। फिर भी, आप सही हैं –

+0

@ पेक्का और जो भी आपके साथ सहमत हो। यदि ओपी का मतलब 'वापसी' का अर्थ 'गूंज' है, तो ओपी सवाल क्यों पूछ रहा है? जब कोड ctor लागू किया जाता है तो कोड ** ** echo' करता है। – Gordon

+0

एक कन्स्ट्रक्टर कुछ भी वापस नहीं करता है ... – netcoder

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