2012-06-17 18 views
28

में फ़ंक्शन कॉल का उपयोग करना फ़ोरैच लूप में फ़ंक्शन कॉल का उपयोग करने के लिए दक्षता के संबंध में कोई समस्या है। उदाहरण के लिए:फ़ोरैच लूप

foreach ($this->getValues() as $value) { 
    //Do something with $value 
} 

बनाम

$values = $this->getValues(); 
foreach ($values as $value) { 
    //Do something with $value 
} 

अनिवार्य रूप से, php काफी चालाक) केवल एक बार पहले उदाहरण में $ this-> getValues ​​(कॉल करने के लिए है, या यह प्रत्येक यात्रा पर इसे कहते है। यह प्रत्येक यात्रा पर यह कहता है, तो यह कैसे जो तत्व अपने वर्तमान पर नज़र, रखता है

+0

* सब कुछ * आप एक लूप के अंदर करते हैं दक्षता को कम कर देता है। – goat

+0

ठीक है, दूसरे दृष्टिकोण के साथ एकमात्र नकारात्मक पक्ष यह है कि आपको एक अतिरिक्त चर (जो स्मृति लेता है) की आवश्यकता होती है। तो मैं पहले दृष्टिकोण के साथ जाना होगा। –

+1

पियर्स, "अतिरिक्त चर" वास्तव में वहां नहीं है। PHP कॉपी-ऑन-राइट का उपयोग करता है जिसका अर्थ है कि '$ मान' और फ़ोरैच लूप उसी डेटासेट का संदर्भ देगा। विचार करने की एकमात्र चीज यह है कि जब परिवर्तनीय कचरा एकत्र किया जा सकता है, जो पहले दूसरे उदाहरण (लूप के अंत में) की तुलना में पहले होता है (फ़ंक्शन/फ़ाइल के अंत में या जब 'अनसेट() 'होता है बुलाया)। –

उत्तर

32

इन दोनों मूलतः एक ही हैं:

foreach ($this->getValues() as $value) { 
// 
} 

$values = $this->getValues(); 
foreach ($values as $value) { 
    // 
} 

$this->getValues() केवल के रूप में यह अंदर नहीं है, एक बार चलेंगे लूप खुद। यदि आपको बाद में getValues के वापसी मूल्य का उपयोग करने की आवश्यकता है, तो आगे बढ़ें और इसे एक चर के लिए असाइन करें ताकि आपको फ़ंक्शन को फिर से कॉल न करना पड़े। यदि नहीं, तो आपको वास्तव में एक चर की आवश्यकता नहीं है।

+0

तो, स्पष्ट रूप से, $ यह-> getValues ​​() को एक बार बुलाया जाता है, और केवल एक बार? –

+7

यह सही है, लेकिन मुझे यकीन नहीं है कि आप "स्पष्ट रूप से" क्या मतलब है। आप इसका परीक्षण क्यों नहीं करते? सरणी लौटने से पहले 'getValues' को एक संदेश लॉग या इको के साथ सीधे कुछ आउटपुट करें ताकि आप देख सकें कि इसे कितनी बार कहा जाता है। –

15

कोई अंतर हो सकता है, लेकिन यह 99.9% असली दुनिया के मामलों के लिए नगण्य होने जा रहा है। किसी भी मामले में, PHP केवल एक बार आपके फ़ंक्शन/विधि को कॉल करेगा। जब आप foreach का उपयोग करते हैं तो आंतरिक रूप से क्या होता है यह है कि PHP एक बार, as से पहले भाग का मूल्यांकन करता है, परिणाम संग्रहीत करता है, और फिर उस पर लूप करता है, वर्तमान तत्व को as के बाद दिए गए स्थानीय चर में डाल देता है। यदि आप इसे स्थानीय चर के लिए इटारेट लिखते हैं, तो आप व्यावहारिक रूप से केवल PHP के प्रयास को डुप्लिकेट कर रहे हैं, इसलिए पहला दृष्टिकोण अतिरिक्त ओवरहेड ले सकता है, लेकिन यह चिंता करने के लिए पर्याप्त नहीं होगा। मैं इसके बजाय पठनीयता के लिए अनुकूलित करना चाहता हूं: यदि फ़ंक्शन कॉल छोटा और स्वयं वर्णन कर रहा है, तो इनलाइन करें; यदि यह जटिल या अस्पष्ट है, तो इसे इसके बजाय एक वर्णनात्मक चर में संग्रहीत करें।

ध्यान दें कि स्थिति सामान्य for और while लूप के साथ अलग है, जो शायद आपको यह धारणा मिलती है। उदाहरण के लिए, निम्न कोड में:

for ($number = 0; $number < $this->getNumberOfItems(); ++$number) { 
    // do stuff... 
} 

... getNumberOfItems() विधि हर यात्रा पर बुलाया जाता है। इस स्थिति में, इसे पूर्ववर्ती करने और इसे स्थानीय चर में संग्रहीत करने का अर्थ होता है।

+0

जब आप कहते हैं * तो पहला दृष्टिकोण अतिरिक्त ओवरहेड ले सकता है * मुझे लगता है कि आपका मतलब है * दूसरा दृष्टिकोण * – whoan

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