मैं गतिशील रूप से PHP ऑब्जेक्ट प्रॉपर्टी नाम कैसे लिख सकता हूं?


83

मेरे कोड में ऑब्जेक्ट गुण हैं जो इस तरह दिखते हैं:

$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];

समस्या यह है कि मेरे पास फील्ड के 100 नाम हैं और संपत्ति के नाम को गतिशील रूप से लिखने की आवश्यकता है। अन्यथा, ऑब्जेक्ट नाम और संपत्ति की कुंजी हमेशा एक ही होगी। इसलिए मैंने कोशिश की:

$obj -> $field[0];

उम्मीद है कि संपत्ति का नाम गतिशील रूप से बदला जाएगा और सही मूल्यों तक पहुंच होगी। लेकिन, मैं stdClass :: $ फ़ील्ड में अपरिभाषित संपत्ति $ फ़ील्ड प्राप्त करता रहता हूं;

कम या ज्यादा मैं गतिशील रूप से php लिखने से पहले कोशिश कर रहा हूं ताकि यह निष्पादित हो ताकि यह उचित मूल्यों को आउटपुट कर सके। कैसे इस दृष्टिकोण के लिए विचार?

जवाबों:


210

PHP 7.0 के लिए अद्यतन करें

PHP 7 ने परिवर्तन की शुरुआत की कि कैसे अप्रत्यक्ष चर और गुण पार्सर स्तर पर संभाले जाते हैं ( अधिक विवरण के लिए संबंधित RFC देखें)। यह वास्तविक व्यवहार को अपेक्षित के करीब लाता है, और इसका मतलब है कि इस मामले $obj->$field[0]में अपेक्षित परिणाम देगा।

उन मामलों में जहां (अब सुधार हुआ) डिफ़ॉल्ट व्यवहार अवांछित है, घुंघराले ब्रेस अभी भी इसे नीचे दिखाए अनुसार ओवरराइड करने के लिए उपयोग किया जा सकता है।

मूल उत्तर

इस तरह पहुँच लिखिए:

$obj->{$field}[0]

यह "ब्रेसिज़ के साथ संलग्न" चाल PHP में उपयोगी है जब भी चर चर के कारण अस्पष्टता होती है।

प्रारंभिक कोड पर विचार करें $obj->$field[0]- क्या इसका मतलब "उस संपत्ति का उपयोग करना है जिसका नाम $field[0]" में दिया गया है , या " 0उस संपत्ति की कुंजी के साथ तत्व का उपयोग करें जिसका नाम $field" में दिया गया है ? ब्रेसिज़ आपको स्पष्ट होने की अनुमति देते हैं।


यह कच्चा वक्तव्य मेरे कोड में काम करता है: गूंज $ json_dump-> ज्यामिति [6] -> अवलोकन [2] -> hayabusa2-> delay_from; लेकिन मैं "ज्यामिति [6] -> अवलोकन [2] -> hayabusa2-> delay_from" को $ पथ और echo $ json_dump -> {$ path} का उपयोग करके इसे "अनुकरण" नहीं कर सकता, मुझे "अनिर्धारित संपत्ति: stdClass: मिलती है। : $ ज्यामिति [6] "
जम्पजैक

31

मुझे लगता है कि आप चर-चर प्रकार संकेतन की तलाश कर रहे हैं, जो अन्य सरणियों / वस्तुओं से मूल्यों तक पहुंचते समय, इस तरह घुंघराले ब्रैकेट सिंटैक्स का उपयोग करके सबसे अच्छा हासिल किया जाता है:

$obj->{field[0]}

12

जादू की विधि __get आप दोस्त हैं:

class MyClass
{
   private $field = array();

   public function __get($name)
   {
      if(isset($this->field[$name]))
        return $this->field[$name];
      else
        throw new Exception("$name dow not exists");
   }
}

उपयोग:

$myobj = new MyClass();
echo $myobj->myprop;

स्पष्टीकरण: आपके सभी फ़ील्ड डेटा को एक सरणी में संग्रहीत किया जाता है। जैसा कि आप $myobj->mypropउस संपत्ति का उपयोग करते हैं, जो स्पष्ट रूप से कक्षा में मौजूद नहीं है। वह जहां __getकहा जाता है। सरणी __getमें नाम दिखता है fieldऔर सही मान देता है।


4
यह मत करो। __get फ़ंक्शन प्रदर्शन हॉग हैं जिन्हें आपको अप्रत्याशित व्यवहार के साथ कुछ गंभीर मुद्दों को बनाने के दौरान संभव होने पर उपयोग करने से बचना चाहिए। यह उदाहरण विशेष रूप से डरावना है क्योंकि यह एक अपवाद को फेंकता है जो गंभीर ऐप-ब्रेकिंग व्यवहार का कारण बन सकता है अगर डेवलपर अपवाद को फेंकने के लिए एक नोन्टेक्स्टेंट विशेषता तक पहुंचने की योजना नहीं बना रहा है, तो एक साधारण विशेषता एक्सेस को संभावित घातक त्रुटि में बदल दें।
moberemk

1

आज मैं उस चुनौती का सामना करता हूं। मैं विकास की उस शैली के साथ समाप्त हुआ

$countTickets = new \stdClass;

foreach ($tickets as $key => $value) {

    if(!isset($countTickets->total)){
        $countTickets->total = 0;
    }

    if(!isset($countTickets->{$value['categoryname']})){
        $countTickets->{$value['categoryname']} = 0;
    }

    $countTickets->total += $value['number'];
    $countTickets->{$value['categoryname']} += $value['number']; 
}

0

मैंने कुछ कोड पर काम किया है जो गतिशील रूप से निर्मित ऑब्जेक्ट गुण का उपयोग करता है। मैंने सोचा था कि गतिशील रूप से बनाई गई वस्तु गुणों का उपयोग करना बहुत अच्छा था (सच, मेरी राय में)। हालाँकि, मेरे कार्यक्रम को चलने में 7 सेकंड का समय लगा। मैंने डायनेमिक ऑब्जेक्ट प्रॉपर्टीज़ को हटा दिया और उन्हें प्रत्येक क्लास के हिस्से के रूप में घोषित ऑब्जेक्ट प्रॉपर्टीज़ (इस मामले में सार्वजनिक) के रूप में बदल दिया। CPU समय 7 सेकंड से 0.177 सेकंड से अधिक चला गया। यह काफी पर्याप्त है।

यह संभव है कि मैं जिस तरह से गतिशील वस्तु गुणों का उपयोग कर रहा था उसमें कुछ गलत कर रहा था। यह भी संभव है कि मेरा कॉन्फ़िगरेशन किसी तरह से टूट गया हो। बेशक, मुझे कहना चाहिए कि मेरी मशीन पर एक बहुत ही सादे वेनिला PHP कॉन्फ़िगरेशन है।


कोड के छोटे स्निपेट दिखाकर इस उपाख्यान को बेहतर बनाया जा सकता है। क्या आपका कोड यहां के किसी उत्तर पर आधारित था? कहीं और जानकारी देकर आप लिंक दे सकते हैं? कुछ वन-लाइनर वे सब हो सकते हैं जिनकी आवश्यकता है। आप का उदाहरण गतिशील रूप से एक वस्तु संपत्ति बनाना है। और बाद में उस संपत्ति को संदर्भित करता है। इसके अलावा, औसतन, आपने कितनी बार प्रत्येक संपत्ति का उपयोग (संदर्भ) किया? आपने किसी ऑब्जेक्ट में कितने डायनेमिक गुण जोड़े हैं? छह से कम? 20 से अधिक?
टूलमेकरवेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.