2012-01-17 13 views
6

संभव डुप्लिकेट:
are arrays in php passed by value or by reference?php सरणी मूल्य प्रतिलिपि या संदर्भ द्वारा असाइन करें?

मैंने सुना पीएचपी सरणियों आवंटित करने के लिए कैसे चुन सकते हैं कि, सरणी के आकार पर निर्भर करता है। यह मूल्य प्रतिलिपि (किसी भी स्केलर प्रकार के रूप में) या संदर्भ द्वारा असाइन कर सकता है।

PHP हमेशा मान की प्रतिलिपि बनाकर वैरिएबल को सरणी आवंटित करता है, जैसा कि यह मैन्युअल में कहता है।

या यह संदर्भ द्वारा असाइन कर सकता है। ?

<?php $a = array(1,2,3); ?> 
+0

तुम सिर्फ जानने की चाह अगर यह द्वारा एक सरणी आवंटित करने के लिए संभव है कर रहे हैं संदर्भ? या आप जानना चाहते हैं कि इसे स्वचालित रूप से करने के लिए इसे सेट करने का कोई तरीका है या नहीं? – jprofitt

+0

मैं जानना चाहता हूं, कभी-कभी पीएचपी इंजन $ ए = सरणी (1,2,3) पास कर सकता है; $ बी = $ ए; '&' चिह्न के बिना संदर्भ द्वारा। – RusAlex

उत्तर

12

आप संदर्भ द्वारा कुछ असाइन नहीं कर सकते हैं जब तक कि आप पहले से मौजूद कुछ का संदर्भ नहीं दे रहे हैं। समान रूप से, आप ऐसी चीज की प्रतिलिपि नहीं बना सकते जो मौजूद नहीं है।

तो यह कोड:

$a = array(1,2,3); 

... न तो प्रतियां या संदर्भ - यह सिर्फ एक नई सरणी मूल्यों के साथ यह भरता है, क्योंकि मानों सचमुच निर्दिष्ट किया गया पैदा करता है।

हालांकि, इस कोड:

$x = 1; 
$y = 2; 
$z = 3; 
$a = array($x,$y,$z); 

... प्रतियां एक सरणी में $x, $y और $z से मान। सरणी मानों को प्रारंभ करने के लिए उपयोग किए जाने वाले वेरिएबल अभी भी अपने दायरे में मौजूद हैं, और सरणी में मानों को प्रभावित किए बिना संशोधित या नष्ट किया जा सकता है।

इस कोड:

$x = 1; 
$y = 2; 
$z = 3; 
$a = array(&$x,&$y,&$z); 

... $x, $y और $z के लिए संदर्भ की एक सरणी (नोटिस &) पैदा करता है। यदि, इस कोड को चलाने के बाद, मैं $x संशोधित करता हूं - मान लें कि मैं इसे 4 का मान देता हूं - यह सरणी में पहले मान को भी संशोधित करेगा। तो जब आप सरणी का उपयोग करते हैं, $a[0] में अब 4 होगा।

PHP में संदर्भ कार्य के बारे में अधिक जानकारी के लिए मैन्युअल के this section देखें।


प्रकार और सरणी सदस्यों के रूप में इस्तेमाल चरों के मान के आधार पर, प्रति आपरेशन भी जब से-मूल्य सौंपा कार्य के समय पर नहीं हो सकता है। आंतरिक रूप से PHP प्रदर्शन और स्मृति दक्षता के कारणों के लिए जितनी संभव हो उतनी स्थितियों में कॉपी-ऑन-राइट का उपयोग करता है। हालांकि, आपके कोड के संदर्भ में व्यवहार के संदर्भ में, आप इसे एक साधारण प्रति के रूप में देख सकते हैं।

15

नियत सरणियों संदर्भ द्वारा उपयोग करने के लिए संभव है, जब अन्य चर सरणी चर बताए:

// By value... 
$a = array(1,2,3); 
$b = $a; 
array_push($a, 5); 
print_r($b); 

// $b is not a reference to $a 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
) 

// By Reference 
$a = array(1,2,3); 
$b = &$a; // Here we assign by reference 
array_push($a, 5); 
print_r($b); 

// $b is a reference to $a and gets the new value (3 => 5) 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 5 
) 
संबंधित मुद्दे