2012-05-03 13 views
7

क्या किसी ऑब्जेक्ट के लिए PHP में किसी ऑब्जेक्ट को सेट करना संभव है? कर के बजाय:PHP ऑब्जेक्ट, एकाधिक गुण सेट करें

$object->prop1 = $something; 
$object->prop2 = $otherthing; 
$object->prop3 = $morethings; 

की तरह कुछ कार्य करें:

$object = (object) array(
    'prop1' => $something, 
    'prop2' => $otherthing, 
    'prop3' => $morethings 
); 

लेकिन वस्तु अधिलेखन के बिना।

+3

आप इस तरह से कोड क्या कर रहे हैं, इस पर असर डालना क्यों चाहते हैं? भविष्य में किसी बिंदु पर (** शायद आप **) को इस कोड को पढ़ने की आवश्यकता होगी और ऐसा कुछ करने से केवल इसे समझना मुश्किल हो जाएगा। – rdlowrey

+0

क्यों इसे सिर्फ एक php फ़ाइल में पेस्ट न करें और इसे चलाएं? यहां पूछने के बजाय कि यह काम करेगा, बस इसे स्वयं आज़माएं। – Yoshi

+2

बस इसे आपके लिए करने के लिए एक सहायक कार्य बनाएं। ऑब्जेक्ट और सरणी में पास करें। –

उत्तर

14

आप जिस तरह से चाहते हैं उसे नहीं। लेकिन यह एक लूप का उपयोग करके किया जा सकता है।

$map = array(
    'prop1' => $something, 
    'prop2' => $otherthing, 
    'prop3' => $morethings 
); 

foreach($map as $k => $v) 
    $object->$k = $v; 

केवल 2 अतिरिक्त लाइनें देखें।

+1

यह 2 और लाइनें नहीं है, लेकिन ** 50% अधिक लाइनें **; खराब होने पर केवल दो गुण हैं। असल में यह 3 लाइनें हैं यदि हम धोखा नहीं देते हैं और बग-रोकथाम '{' और '}' का उपयोग नहीं करते हैं। – Pacerier

+1

@Pacerier मुझे आशा है कि आप ट्रोलिंग कर रहे हैं। वास्तविक उपयोग-मामले में ऐसे सरणी सैकड़ों मूल्य रख सकते हैं। बेशक यदि आप केवल 2 मान देते हैं, तो यह अतिरिक्त काम है क्योंकि यह तीन पंक्तियां हैं। लेकिन यदि आप 358 मानों के साथ सरणी के साथ काम करते हैं, तो यह समाधान तीन पंक्तियों पर रहता है। – Holonaut

+0

@ होलोनॉट, यह एक गंभीर टिप्पणी होने का मतलब है जो ट्रोल टिप्पणी नहीं है। निश्चित रूप से, ऐसे मामलों का उपयोग करने के लिए बाध्य हैं जहां सैकड़ों मूल्य हैं, लेकिन कई उपयोग मामलों में केवल दो, तीन, या चार मान हैं। – Pacerier

4

मैं आपको सलाह दूंगा कि ऐसा न करें। गंभीरता से, नहीं है।

आपका कोड पहले से बहुत अधिक क्लीनर है, यह आपके इरादे से स्पष्ट है, और आप अपने कोड को उस सीमा तक नहीं रोक रहे हैं जहां भविष्य में कभी-कभी कोई आपके कोड को देखेगा और सोचेंगे "क्या था बेवकूफ सोच "?

यदि आप कुछ ऐसा करने का आग्रह करते हैं जो स्पष्ट रूप से गलत तरीका है, तो आप हमेशा एक सरणी बना सकते हैं, इसे फिर से बना सकते हैं और सभी गुणों को लूप में सेट कर सकते हैं। हालांकि मैं आपको कोड नहीं दूंगा। यह बुरा है।

+0

सच नहीं है। अन्य भाषाओं में यह वाक्यविन्यास है और उन्हें ** स्वच्छ कोड ** के रूप में सम्मानित किया जाता है। यह ** ** आप इसका उपयोग कैसे करते हैं इस पर निर्भर करता है। – Pacerier

2

आप वस्तु के लिए कुछ setters कि वस्तु लौट लिख सकते हैं:

public function setSomething($something) 
{ 
$this->something = $something; 
return $this; //this will return the current object 
} 

फिर आप कर सकता है:

$object->setSomething("something") 
     ->setSomethingelse("somethingelse") 
     ->setMoreThings("some more things"); 

आप एक __set समारोह के रूप में प्रत्येक संपत्ति के लिए एक सेटर लिखने के लिए की आवश्यकता होगी एक मूल्य वापस करने में सक्षम नहीं है।

वैकल्पिक रूप से, एक एकल फ़ंक्शन को संपत्ति => मानों की सरणी स्वीकार करने और सबकुछ सेट करने के लिए सेट करें?

public function setProperties($array) 
{ 
    foreach($array as $property => $value) 
    { 
    $this->{$property} = $value; 
    } 
    return $this; 
} 

और सरणी में पारित:

$object->setProperties(array('something' => 'someText', 'somethingElse' => 'more text', 'moreThings'=>'a lot more text')); 
+0

"प्रत्येक संपत्ति के लिए एक __सेट फ़ंक्शन के रूप में एक सेटटर लिखने की आवश्यकता है जो मान वापस करने में सक्षम नहीं है"। इस के आसपास एक रास्ता के लिए मेरा जवाब देखें। –

8

आप Object Oriented PHP Best Practices पर गौर करना चाहिए:

"के बाद से सेटर कार्यों लौट $ इस आप कर सकते हैं उन्हें इतनी तरह श्रृंखला:"

$object->setName('Bob') 
     ->setHairColor('green') 
     ->setAddress('someplace'); 

यह आकस्मिक रूप से fluent interface के रूप में जाना जाता है।

+3

यह एक पूरी तरह से अलग बात है। वह ** परिवर्तनीय गुण ** बनाने के लिए शॉर्टकट के बारे में बात कर रहा है और इसका आपके उत्तर से कोई लेना देना नहीं है। – Pacerier

+0

यदि आप 'सार्वजनिक फ़ंक्शन __set ($ k, $ v) {$ this -> $ k = $ v का उपयोग करने के बारे में बात कर रहे थे; $ 1 वापस करें;} ', फिर यह * अभी भी * काम नहीं करेगा क्योंकि (($ obj-> k =" v ") -> k2) =" v2 "; 'वाक्यविन्यास त्रुटि है। – Pacerier

0

मैं वास्तव में यह कर नहीं .... लेकिन मनोरंजन के लिए मैं

$object = (object) ($props + (array) $object); 

आप $ से बना एक stdClass साथ खत्म सार्वजनिक गुण वस्तुओं होगा, तो यह अपने प्रकार खो देता है।

+0

यह उस वस्तु को ओवरराइड करता है जो प्रश्न की आवश्यकता को पूरा करने में विफल रहता है। '$ ऑब्जेक्ट === $ old_object' अब सत्य नहीं है। – Pacerier

0

विधिtranstypage क्लास सरणी गुण या stdClass से सरणी के लिए विधि। प्रत्यक्ष transtypage (ऑब्जेक्ट) का उपयोग संख्यात्मक सूचकांक को हटा देगा, लेकिन इस विधि का उपयोग यह संख्यात्मक सूचकांक रखेंगे।

public function objectThis($array = null) { 
    if (!$array) { 
     foreach ($this as $property_name => $property_values) { 
      if (is_array($property_values) && !empty($property_values)) { 
       $this->{$property_name} = $this->objectThis($property_values); 
      } else if (is_array($property_values) && empty($property_values)) { 
       $this->{$property_name} = new stdClass(); 
      } 
     } 
    } else { 
     $object = new stdClass(); 
     foreach ($array as $index => $values) { 
      if (is_array($values) && empty($values)) { 
       $object->{$index} = new stdClass(); 
      } else if (is_array($values)) { 
       $object->{$index} = $this->objectThis($values); 
      } else if (is_object($values)) { 
       $object->{$index} = $this->objectThis($values); 
      } else { 
       $object->{$index} = $values; 
      } 
     } 
     return $object; 
    } 
} 
+0

कोड नमूना से पहले स्पष्टीकरण कुछ सुधार का उपयोग कर सकता है –

0

मुझे पता है यह एक पुराने सवाल है, लेकिन दूसरों कि यह आ जाती के लाभ के लिए, मैं इस अपने आप को हाल ही में हल और परिणाम

<?php 
    //Just some setup 
    header('Content-Type: text/plain'); 
    $account = (object) array(
     'email' => 'foo', 
     'dob'=>((object)array(
      'day'=>1, 
      'month'=>1, 
      'year'=>((object)array('century'=>1900,'decade'=>0)) 
     )) 
    ); 
    var_dump($account); 
    echo "\n\n==============\n\n"; 

    //The functions 
    function &getObjRef(&$obj,$prop) { 
     return $obj->{$prop}; 
    } 

    function updateObjFromArray(&$obj,$array){ 
     foreach ($array as $key=>$value) { 
      if(!is_array($value)) 
       $obj->{$key} = $value; 
      else{ 
       $ref = getObjRef($obj,$key); 
       updateObjFromArray($ref,$value); 
      } 
     } 
    } 

    //Test 
    updateObjFromArray($account,array(
     'id' => '123', 
     'email' => '[email protected]', 
     'dob'=>array(
      'day'=>19, 
      'month'=>11, 
      'year'=>array('century'=>1900,'decade'=>80) 
     ) 
    )); 
    var_dump($account); 

साझा करने के लिए जाहिर है वहाँ कोई सुरक्षा उपायों में बनाया गया हैं चाहता था मुख्य चेतावनी यह है कि updateObjFromArray फ़ंक्शन मानता है कि $array के भीतर किसी भी नेस्टेड सरणी के लिए, $obj में संबंधित कुंजी पहले से मौजूद है और यह एक वस्तु है, यह सत्य होना चाहिए या किसी ऑब्जेक्ट की तरह इसका इलाज करना एक त्रुटि फेंक देगा।

आशा है कि इससे मदद मिलती है! :)

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