2009-12-07 11 views
10

से तर्क के साथ कक्षा को तुरंत कैसे चालू करें मैं ऐसी स्थितियों में हूं जहां मुझे किसी अन्य वर्ग के उदाहरण के भीतर तर्क के साथ कक्षा को तुरंत चालू करने की आवश्यकता है। , मैं वर्ग के cls नीचे का उपयोग कर समारोह श्रेणी से ऊपर का दृष्टांत की जरूरत अबPHP: किसी अन्य वर्ग

//test.php 

class test 
{ 
    function __construct($a, $b, $c) 
    { 
     echo $a . '<br />'; 
     echo $b . '<br />'; 
     echo $c . '<br />'; 
    } 
} 

:

class myclass 
{ 
function cls($file_name, $args = array()) 
{ 
    include $file_name . ".php"; 

    if (isset($args)) 
    { 
     // this is where the problem might be, i need to pass as many arguments as test class has. 
     $class_instance = new $file_name($args); 
    } 
    else 
    { 
     $class_instance = new $file_name(); 
    } 

    return $class_instance; 
} 
} 

अब जब मैं थोड़ी देर के तर्क गुजर परीक्षण वर्ग का एक उदाहरण बनाने की कोशिश यहाँ प्रोटोटाइप है यह करने के लिए:

$myclass = new myclass; 
$test = $myclass->cls('test', array('a1', 'b2', 'c3')); 

यह देता है त्रुटि: गुम तर्क को 1 और 2; केवल पहला तर्क पारित किया जाता है।

यह ठीक काम करता है अगर मैं उस वर्ग को तत्काल करता हूं जिसमें उसके कन्स्ट्रक्टर फ़ंक्शन में कोई तर्क नहीं है।

अनुभवी PHP डेवलपर्स के लिए, ऊपर कोई समस्या नहीं होनी चाहिए। कृपया मदद करे।

धन्यवाद

+0

आपके प्रश्न से संबंधित नहीं है, लेकिन फ़ंक्शन परिभाषा में आप सरणी() को असाइन करते समय $ args हमेशा 'isset'' होंगे। आपको 'खाली', या '$ args = null' में रुचि हो सकती है। – Tordek

+0

मुझे खेद है, यह आपके प्रश्न से भी संबंधित नहीं है, लेकिन आप जो कर रहे हैं वह अच्छा नहीं है। आपके प्रश्न का उत्तर यह है: अपने कन्स्ट्रक्टर को सरणी लेनी चाहिए, कुछ वर्ग विशेषताओं को रखें, फिर सरणी को संसाधित करें और इसे क्लास विशेषताओं में मैप करें। लेकिन फिर, आप कुछ ऐसा कर रहे हैं जो ठंडा नहीं है। – DarthVader

+0

टेस्ट क्लास और अन्य अन्य डेवलपर्स द्वारा तर्क के साथ अपने स्वयं के तरीके से उपयोग किए जाने हैं और इसलिए, मैं उन्हें केवल रचनाकारों के सरणी के रूप में तर्कों को पास करने के लिए प्रतिबंधित नहीं करना चाहता हूं। – Sarfraz

उत्तर

28

आप प्रतिबिंब http://php.net/manual/en/class.reflectionclass.php

if(count($args) == 0) 
    $obj = new $className; 
else { 
    $r = new ReflectionClass($className); 
    $obj = $r->newInstanceArgs($args); 
} 
+0

मैं वास्तव में इस ज्ञान से प्रेरित हूं कि स्टीरियोफ्रोग है क्योंकि अधिकांश लोगों को प्रतिबिंब वर्ग के बारे में भी पता नहीं है और मैं खुद को नहीं जानता था कि हम इस तरह के तर्कों को पारित करने के लिए प्रतिबिंब वर्ग का उपयोग कर सकते हैं। यह मेरी समस्या हल हो गया मैं कई दिनों के लिए समाधान खोजने में सक्षम नहीं था। यहां तक ​​कि सबसे अनुभवी डेवलपर भी मेरे प्रश्न का संतोषजनक उत्तर प्रदान करने में सक्षम नहीं थे जो कि बहुत महत्वपूर्ण है और यहां हर किसी को इस प्रश्न के उस परिदृश्य को देखना चाहिए। वैसे भी मैं इस बहुत ही महत्वपूर्ण सवाल का हल ढूंढने में बहुत खुश हूं। धन्यवाद stereofrog :) – Sarfraz

+1

मैं एक गैर प्रतिबिंब आधार समाधान की खोज कर रहा था, लेकिन ऐसा लगता है कि मुझे इसका सहारा लेना पड़ा। अरे। – yclian

4

आप कर सकते हैं:

1) एक सरणी है, जो डेटा आप पारित करने के लिए इच्छा शामिल स्वीकार करने के लिए परीक्षण वर्ग संशोधित करें।

//test.php 

class test 
{ 
     function __construct($a) 
     { 
       echo $a[0] . '<br />'; 
       echo $a[1] . '<br />'; 
       echo $a[2] . '<br />'; 
     } 
} 

2) यदि कोई उपयोगकर्ता विधि के बजाय निर्माता का उपयोग कर शुरू करने और call_user_func_array() समारोह का उपयोग कर इसे कहते हैं।

//test.php 

class test 
{ 
     function __construct() 
     { 

     } 

     public function init($a, $b, $c){ 
       echo $a . '<br />'; 
       echo $b . '<br />'; 
       echo $c . '<br />'; 
     } 

} 

अपने मुख्य वर्ग में:

class myclass 
{ 
function cls($file_name, $args = array()) 
{ 
     include $file_name . ".php"; 

     if (isset($args)) 
     { 
       // this is where the problem might be, i need to pass as many arguments as test class has. 
       $class_instance = new $file_name($args); 
       call_user_func_array(array($class_instance,'init'), $args); 
     } 
     else 
     { 
       $class_instance = new $file_name(); 
     } 

     return $class_instance; 
} 
} 

http://www.php.net/manual/en/function.call-user-func-array.php

अंत में, आप अपने निर्माता खाली पैरामीटर छोड़ दो और func_get_args() उपयोग कर सकते हैं।

//test.php 

class test 
{ 
     function __construct() 
     { 
       $a = func_get_args(); 
       echo $a[0] . '<br />'; 
       echo $a[1] . '<br />'; 
       echo $a[2] . '<br />'; 
     } 
} 

http://sg.php.net/manual/en/function.func-get-args.php

1

आप call_user_func_array() मेरा मानना ​​है कि इस्तेमाल कर सकते हैं।

या आप निर्माता के तर्कों सूची छोड़ सकता है, और फिर निर्माता के अंदर का उपयोग इस

$args = func_get_args(); 
+0

इस उत्तर का पहला भाग कन्स्ट्रक्टर को कॉल करने में मदद करता है; दूसरा भाग इस कक्षा में इंटरफ़ेस निसर बनाने में मदद कर सकता है (केवल सरणी में उन्हें लपेटने के बजाय तर्कों को पास करें)। – Tordek

1
class textProperty 
{ 
    public $start; 
    public $end; 
    function textProperty($start, $end) 
    { 
     $this->start = $start; 
     $this->end = $end; 
    } 

} 

$ वस्तु की जरूरत = नए textProperty ($ शुरू करो, $ अंत);

काम नहीं करते?

0

सबसे आसान तरीका मैं पाया है:

if ($depCount === 0) { 
      $instance = new $clazz(); 
     } elseif ($depCount === 1) { 
      $instance = new $clazz($depInstances[0]); 
     } elseif ($depCount === 2) { 
      $instance = new $clazz($depInstances[0], $depInstances[1]); 
     } elseif ($depCount === 3) { 
      $instance = new $clazz($depInstances[0], $depInstances[1], $depInstances[2]); 
     } 

क्षमा थोड़ा कच्चा है, लेकिन आप विचार को समझना चाहिए।

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