2012-05-26 14 views
5

द्वारा रिटर्निंग पीएचपी प्रलेखन यह कहते हैं:संदर्भ

प्रदर्शन को बढ़ाने के लिए वापसी-दर-संदर्भ का उपयोग न करें। इंजन स्वचालित रूप से इसे स्वयं अनुकूलित करेगा।

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

यदि सरणी में 1 अरब प्रविष्टियां हैं, तो क्या मुझे स्मृति में संग्रहीत 1 अरब प्रविष्टियों के साथ दो सरणी नहीं मिलेंगी यदि मैं इसे संदर्भ से पास नहीं करता हूं?

उत्तर

5

PHP लिखने पर प्रति का उपयोग करता है। इसका अर्थ यह है कि यदि आप फ़ंक्शन पैरामीटर के रूप में विशाल सरणी पास करते हैं और केवल इससे पढ़ते हैं (जैसे फ़ोरैच), तो आप इसे लिख नहीं पाएंगे, इसलिए इसे प्रतिलिपि बनाने की आवश्यकता नहीं है।

$count = count($huge_array); // read the reference at the bottom 
for($i = 0; $i < $count $i++) { 
    $value = 2*$huge_array[$i]/15; 
    if($value > 3) 
     $sub_array []= $value; 
} 

$ subarray जो छोटा होना चाहिए (यह बहुत बड़ा सरणी के एक सबसेट है), केवल जरूरत (परिवर्तित) का डेटा होगा।

यदि आप मूल $ huge_array के मानों को बदलने का इरादा नहीं रखते हैं तो इसे कभी भी कॉपी नहीं किया जाएगा, इसलिए कोई अतिरिक्त मेमोरी उपयोग नहीं की जाती है।

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

यदि आप मूल सरणी के एक परिवर्तित संस्करण को बनाने और वापस करने का इरादा रखते हैं तो आप अतिरिक्त मेमोरी PHP आपके लिए आवंटित कर रहे हैं।

यदि आप मूल सरणी के एक छोटे से छोटे सबसेट को बनाने और वापस करने का इरादा रखते हैं तो आप एक नई खाली सरणी तैयार करेंगे जिसमें आप विशाल सरणी से कुछ डेटा कॉपी करेंगे और सावधान रहना चाहिए कि $ में मूल्यों को ओवरराइट न करें huge_array, तो आप $ huge_array से लिखने से बचेंगे और इससे पढ़ने पर जोर देंगे।

यह link बताता है कि PHP को मूल्य उपयोग मामलों के द्वारा अनुकूलित करने के लिए अनुकूलित किया गया था।

लेखन पर प्रतिलिपि केवल तभी काम करती है जब चर एक संदर्भ की अपेक्षा करने वाले फ़ंक्शन को पारित किया जा रहा संदर्भ नहीं है, यदि यह है, तो इसे प्रतिलिपि बनाने के आसपास इसे पारित करना है।

यह PHP मूल कार्यों को बनाता है जो मान द्वारा पारित होने की तर्क की अपेक्षा करते हैं और संदर्भ के मान को संदर्भित चर प्रतिलिपि प्राप्त करते हैं।

function foo(&$data) { 
    for ($i = 0; $i < strlen($data); $i++) { 
     do_something($data{$i}); 
    } 
} 

$string = "... looooong string with lots of data ....."; 
foo(string); 

सी में स्ट्रेलन निष्पादित करने से यह गणना करने के लिए पूरी स्ट्रिंग पर पुनरावृत्ति होगी। PHP तारों में संलग्न लम्बाई मान होता है। तो strlen वहां से मूल्य (तेजी से) पढ़ता है।

लेकिन यदि आप इसे एक संदर्भित चर देते हैं तो इसे इसकी लंबाई पढ़ने से पहले इसे कॉपी करना होगा, इसलिए इसे इसकी तर्क सूची में कॉपी करने के लिए मूल्य को फिर से चालू कर दिया जाएगा, लंबाई को पढ़ और वापस कर दिया जाएगा (और बाद में स्मृति के लिए स्मृति जारी करें ताजा नकल स्ट्रिंग)।

+0

एक बात है। Foreach सरणी बदलता है: यह सरणी के आंतरिक सूचक बदलता है। इसलिए गाय यहाँ काम नहीं करेगा। [साबित करें] (http://ideone.com/F2O3y) (foreach रीसेट + अगली के समान है)। – meze

+0

क्या आप इस बारे में सुनिश्चित हैं? मेरा मतलब है कि मुझे पता है कि यह आंतरिक सूचक बदलता है लेकिन क्या वह गाय को अमान्य करता है? –

+0

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

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