2012-08-09 5 views
7

मैं कुछ कोड है कि (एक चर से यानी) एक गतिशील वर्ग के साथ विज्ञापन उदाहरण बनाता है:परिवर्तनीय तर्कों के साथ PHP में प्रोग्रामेटिक रूप से गतिशील क्लास उदाहरण बनाना?

$instance = new $myClass(); 

निर्माता के बाद से $myClass मूल्य, मैं बहस के एक चर सूची कैसे पारित करना के आधार पर अलग तर्क गणना है नए बयान के लिए? क्या यह संभव है?

+0

प्रतिबिंब – Esailija

उत्तर

10

तुम भी उपरोक्त कोड में निर्माता का निरीक्षण कर सकते हैं:

$constructorRefl = $refl->getMethod("__construct"); 

print_r($constructorRefl->getParameters()); 

/* 
Array 
(
    [0] => ReflectionParameter Object 
     (
      [name] => a 
     ) 

    [1] => ReflectionParameter Object 
     (
      [name] => b 
     ) 

    [2] => ReflectionParameter Object 
     (
      [name] => c 
     ) 

) 
*/ 
1

सबसे आसान मार्ग एक सरणी का उपयोग करना होगा।

public function __construct($args = array()) 
{ 
    foreach($array as $k => $v) 
    { 
    if(property_exists('myClass', $k)) // where myClass is your class name. 
    { 
     $this->{$k} = $v; 
    } 
    } 
} 
+0

हां दिमाग में आता है, इसके बारे में सोचा, मैं बस सोच रहा था कि कोई और दृष्टिकोण संभव था या नहीं। इसके अलावा, property_exists() चाल अद्भुत है, बहुत बहुत धन्यवाद! – Cranio

0

मैं पता नहीं क्यों लेकिन मैं अपने कोड में नए ऑपरेटर का उपयोग पसंद नहीं है।

स्थिर रूप से नामित कक्षा का उदाहरण बनाने के लिए यहां एक स्थिर कार्य है।

class ClassName { 
    public static function init(){  
     return (new ReflectionClass(get_called_class()))->newInstanceArgs(func_get_args());   
    } 

    public static function initArray($array=[]){  
     return (new ReflectionClass(get_called_class()))->newInstanceArgs($array);   
    } 

    public function __construct($arg1, $arg2, $arg3){ 
     ///construction code 
    } 
} 

आप इसे एक नाम स्थान तुम इतनी तरह ReflectionClass से बचने के लिए की जरूरत के अंदर उपयोग कर रहे हैं: नई \ ReflectionClass ...

अब आप तर्क और यह के परिवर्तनशील साथ init() विधि कॉल कर सकते हैं इसे कन्स्ट्रक्टर को पास कर देगा और आपके लिए एक वस्तु वापस कर देगा।

सामान्य नई

echo (new ClassName('arg1', 'arg2', 'arg3'))->method1()->method2(); 

स्टेटिक कॉल का उपयोग कर नए

$obj = new ClassName('arg1', 'arg2', 'arg3'); 
echo $obj->method1()->method2(); 

इनलाइन तरह से उपयोग करते हुए जिस तरह से नई

echo ClassName::init('arg1', 'arg2', 'arg3')->method1()->method2(); 
के बजाय init का उपयोग

स्टेटिक नई

echo ClassName::initArray(['arg1', 'arg2', 'arg3'])->method1()->method2(); 

स्थिर तरीकों के बारे में अच्छी बात यह है के बजाय initArray का उपयोग कर कॉल है कि आप इस तरह के निर्माता तर्क मान्यता के रूप में init तरीकों में कुछ पूर्व निर्माण आपरेशन चला सकते है।

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