2009-04-23 20 views
8

पर तर्क पास करना मैं नीचे परिभाषित ऑब्जेक्ट() फ़ंक्शन का उपयोग करके कक्षा कन्स्ट्रक्टर को तर्कसंगत संख्याओं के तर्क कैसे पारित कर सकता हूं?क्लास कन्स्ट्रक्टर

<?php 

/* 
./index.php 
*/ 

function Object($object) 
{ 
    static $instance = array(); 

    if (is_file('./' . $object . '.php') === true) 
    { 
     $class = basename($object); 

     if (array_key_exists($class, $instance) === false) 
     { 
      if (class_exists($class, false) === false) 
      { 
       require('./' . $object . '.php'); 
      } 

      /* 
      How can I pass custom arguments, using the 
      func_get_args() function to the class constructor? 

      $instance[$class] = new $class(func_get_arg(1), func_get_arg(2), ...); 
      */ 

      $instance[$class] = new $class(); 
     } 

     return $instance[$class]; 
    } 

    return false; 
} 

/* 
How do I make this work? 
*/ 

Object('libraries/DB', 'DATABASE', 'USERNAME', 'PASSWORD')->Query(/* Some Query */); 

/* 
./libraries/DB.php 
*/ 

class DB 
{ 
    public function __construct($database, $username, $password, $host = 'localhost', $port = 3306) 
    { 
     // do stuff here 
    } 
} 

?> 

उत्तर

14
$klass = new ReflectionClass($classname); 
$thing = $klass->newInstanceArgs($args); 

हालांकि प्रतिबिंब का उपयोग करने की आवश्यकता से पता चलता है कि आप अपने डिजाइन में कुछ अपरिवर्तित कर रहे हैं। आप इस समारोह को पहली जगह क्यों लिखना चाहते हैं?

+0

मैं मानता हूं कि यह फ़ंक्शन थोड़ा बकवास प्रतीत हो सकता है लेकिन मैं इसे छोटी चीजों के लिए उपयोग करता हूं जहां एक ढांचा बहुत फूला हुआ हो सकता है। और चूंकि यह एक "ऑटोलोडर" के रूप में कार्य करता है, ऑब्जेक्ट कन्स्ट्रक्टर और सिंगलटन कंटेनर यह पूरी तरह से काम करता है। –

+0

बीटीडब्ल्यू, कि प्रतिबिंब वर्ग वास्तव में आसान है, क्या PHP 5.3 की नई सुविधाओं पर कोई क्रैश कोर्स उपलब्ध है? मैंने PHP मैनुअल की जांच की लेकिन क्या यह मुझे है या इसमें बहुत सारे दस्तावेज की कमी है? –

+0

यह आप नहीं है: दस्तावेज उस पर बदसूरत है। आपको http://www.php.net/oop5.reflection के साथ करना होगा। इसके अलावा, यह 5.1 के बाद से रहा है (या यह 5.0 है?), इसलिए यह 5.3 – troelskn

3

आपकी कक्षा के अलग-अलग पैरामीटर लेने के बजाय मैं इसे एक सरणी लेता।

class DB 
{ 
    public function __construct(array $params) 
    { 
     // do stuff here 
    } 
} 

इस तरह आप func_get_args के सीधे अपने निर्माता में सीधे परिणाम पारित कर सकते हैं। अब एकमात्र समस्या सरणी कुंजी/मानों को समझने में सक्षम है।

मुझे यह भी पता करने के लिए :)

+0

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

0

मैं इस प्रयास नहीं किया है प्रसन्नता होगी किसी और किसी भी विचार है, लेकिन call_user_func_array लगता है आप की तरह चाहते हैं।

$thing = call_user_func_array(array($classname, '__construct'), $args); 

PHP Documentation में एक नज़र डालें।

+0

काम नहीं करता है। = \ call_user_func_array (सरणी (नया $ classname(), '__construct'), $ args); यह काम करता है लेकिन फिर मैं कन्स्ट्रक्टर को दो बार बुलाऊंगा। –

+0

नए $ classname() के बिना इसे आज़माएं। – staticsan

+0

घातक त्रुटि: गैर स्थैतिक विधि परीक्षण :: __ निर्माण() को स्थिर रूप से –

0

प्रतिबिंब विधि के लिए एक विकल्प, आपके कोड का मूल्यांकन करेगा।

eval('$instance = new className('.implode(', ', $args).');'); 
+0

की एक नई सुविधा नहीं है Eval बहुत हमेशा एक बुरा विचार है – Nitroware

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