PHP में गतिशील चर नामों के साथ ब्रेसिज़ का उपयोग करना


191

मैं गतिशील चर नामों का उपयोग करने की कोशिश कर रहा हूं (मुझे यकीन नहीं है कि वे वास्तव में क्या कहते हैं) लेकिन इस तरह से बहुत अधिक:

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

रिटर्न nullजो मुझे बताता है कि यह काम नहीं कर रहा है। मुझे पता नहीं है कि मैं जो वाक्यविन्यास या तकनीक खोज रहा हूं वह यहां है, जो अनुसंधान के लिए कठिन बनाता है। $filelistपहले से परिभाषित किया गया है।


22
नहीं ! उनका उपयोग करने का एक अच्छा कारण कभी नहीं है। वे, प्रभावी ढंग से, सिर्फ एक बेकार सरणी हैं। इसके बजाय एक उचित सरणी का उपयोग करें।
क्वेंटिन

ठीक है, मुझे क्षमा करें, मैं अभी वापस गया और मैंने अब तक पूछे गए प्रत्येक प्रश्न का उत्तर चुना। अच्छी बात यह केवल 7: पी
user1159454

2
और क्वेंटिन, वे बुरे व्यवहार क्यों हैं ?? वहाँ एक कारण वे arrays के साथ मौजूद होगा मुझे लगता है
user1159454

@ user1159454 - वे सभी उपकरणों के बिना एक अव्यवस्थित गड़बड़ी है जो उन्हें उपलब्ध सरणियों पर लागू किया जा सकता है। वे प्राचीन विरासत कारणों और पागल किनारे के मामलों के लिए मौजूद हैं।
क्वेंटिन

8
क्रेजी एज के मामले ठीक-ठीक हो सकते हैं कि कोई इस सवाल को क्यों पूछना चाहेगा।
विन्सेन्ट

जवाबों:


511

उन्हें लपेटें {}:

${"file" . $i} = file($filelist[$i]);

काम करने का उदाहरण


का उपयोग करते हुए ${}एक तरह से है गतिशील चर, सरल उदाहरण बनाने के लिए:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there

4
क्या एक ही तर्क के साथ गतिशील सरणियों का निर्माण भी संभव है?
dtakis

मुझे @dakakis का भी यही शक है, क्या आप हमारी मदद कर सकते हैं? यदि संभव हो, तो कृपया इस प्रश्न पर एक नज़र डालें ।
मार्सियो माजुकाटो

जट एक चेतावनी है यदि आप एक चर (सबसे उपयोगी तरीका IMHO) को शामिल करने के लिए इसका उपयोग कर रहे हैं तो दोहरे उद्धरण चिह्नों का उपयोग करना न भूलें। आदि के बजाय ${'fixedTime$i'} = $row['timeInstance'];आपको बहुत उपयोगी नहीं देता है (सौभाग्य से इसे लगभग सीधे देखा जाता है।)$fixedTime$i$fixedTime1, $fixedTime2
BeNice

81

अवलोकन

PHP में, आप $इसे एक गतिशील चर बनाने के लिए एक चर के सामने एक अतिरिक्त रख सकते हैं :

$$variableName = $value;

हालांकि मैं इसकी अनुशंसा नहीं करूंगा, आप इस व्यवहार की भी श्रृंखला बना सकते हैं:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

आप के $variableNameबीच में डाल करने के लिए मजबूर नहीं कर सकते हैं {}:

${$variableName} = $value;

उपयोग करना {}केवल तभी अनिवार्य है जब आपके चर का नाम स्वयं कई मूल्यों की एक रचना है, जैसे:

${$variableNamePart1 . $variableNamePart2} = $value;

यह हमेशा उपयोग करने के लिए अनुशंसित है {}, क्योंकि यह अधिक पठनीय है।

PHP5 और PHP7 के बीच अंतर

हमेशा उपयोग करने का एक और कारण {}, यह है कि PHP5 और PHP7 में गतिशील चर से निपटने का एक अलग तरीका है, जिसके परिणामस्वरूप कुछ मामलों में एक अलग परिणाम होता है।

PHP7 में, डायनामिक वैरिएबल्स, प्रॉपर्टीज़ और तरीकों का अब लेफ्ट-टू-राइट ऑर्डर में कड़ाई से मूल्यांकन किया जाएगा, जैसा कि PHP5 में विशेष मामलों के मिश्रण के विपरीत है। नीचे दिए गए उदाहरण बताते हैं कि मूल्यांकन का क्रम कैसे बदल गया है।

मामला एक : $$foo['bar']['baz']

  • PHP5 इंटरप्टेशन: ${$foo['bar']['baz']}
  • PHP7 इंटरप्टेशन: ${$foo}['bar']['baz']

केस 2: $foo->$bar['baz']

  • PHP5 इंटरप्टेशन: $foo->{$bar['baz']}
  • PHP7 इंटरप्टेशन: $foo->{$bar}['baz']

केस 3: $foo->$bar['baz']()

  • PHP5 इंटरप्टेशन: $foo->{$bar['baz']}()
  • PHP7 इंटरप्टेशन: $foo->{$bar}['baz']()

केस 4: Foo::$bar['baz']()

  • PHP5 इंटरप्टेशन: Foo::{$bar['baz']}()
  • PHP7 इंटरप्टेशन: Foo::{$bar}['baz']()

6
एक संदिग्ध विषय का एक अच्छा जवाब। मुझे वास्तव में खुशी है कि मुझे ऐसे कोड को डिबग करने की आवश्यकता नहीं है।
मार्टिंस्टेकली

4
सबसे अच्छा जवाब क्योंकि यह सिर्फ निर्णय के बिना सवाल का जवाब देता है
Iculous

2
हाँ, हमें बस कुछ विरासत कोड के साथ कुछ परेशानी थी। उत्पादन PHP5.5 था, देव वातावरण PHP7 था। मैं इस सवाल पर हामी भर रहा हूं।
ओगियर स्केल्विस


5

मैं एक क्वेरी से लौटे परिणामों पर अक्सर ऐसा करता हूं ..

जैसे

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

अब मैं $ MyQueryResult ['MyFieldname'] के बजाय $ MyFieldname (जो इको स्टेटमेंट आदि में आसान है) का उपयोग कर सकता हूं।

हां, यह शायद आलसी है, लेकिन मुझे कभी कोई समस्या नहीं हुई।


14
क्या आपने कभी PHP के एक्सट्रैक्ट () फ़ंक्शन का उपयोग करने की कोशिश की है? php.net/manual/en/function.extract.php
डार्कसाइड

1
DB परिणाम सेट के लिए एक-लाइनर काम: foreach ($ k => $ v के रूप में $ पंक्ति) {$ $ k = $ v}
Iculous

2

टॉम यदि आपके पास मौजूदा सरणी है तो आप उस सरणी को ऑब्जेक्ट में बदल सकते हैं और इस तरह उपयोग कर सकते हैं:

$r = (object) $MyQueryResult;
echo $r->key;

0

मेरे पास गतिशील रूप से बनाए गए परिवर्तनीय मूल्य के लिए एक समाधान है और एक चर में सभी मूल्य संयुक्त हैं।

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}

0

मैं एक ऐसी स्थिति में था जहां मेरे पास 6 समान सरणियां थीं और मुझे दूसरे चर के आधार पर सही को चुनने की आवश्यकता थी और फिर इसे मान प्रदान करें। यहाँ दिखाए गए मामले में $ comp_cat 'a' था, इसलिए मुझे अपनी 'a' सरणी लेने की आवश्यकता थी (I भी बेशक 'b' से 'f' सरणियाँ थी)

ध्यान दें कि सरणी में चर की स्थिति के लिए मान समापन ब्रेस के बाद जाते हैं।

$ {'comp_cat _'। $ comp_cat .'_ arrest '} [1] [0] = "FRED BLOGGS";

$ {'comp_cat _'। $ comp_cat .'_ arrest '} [1] [1] = $ file_didy;

इको 'फर्स्ट एरे वैल्यू' है। $ comp_cat_a_arr [1] [0]। ' और दूसरा मूल्य $ comp_cat_a_arr [1] [1] है;


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.