2010-12-07 12 views
5

मैं PHP में काम कर रहा हूं।किसी अन्य फ़ंक्शन को कॉल करके फ़ंक्शन सेट में स्टेटिक चर

मेरे पास एक फ़ंक्शन (एफ 1) है जिसे एक परिवर्तनीय मात्रा कहा जाता है। उस फ़ंक्शन के भीतर, मुझे किसी अन्य फ़ंक्शन (F2) से निरंतर डेटा सेट लोड करने की आवश्यकता है। यह हमेशा एक ही डेटा सेट लोड होता है, हालांकि सेट लोड करने में कुछ डेटाबेस लुकअप और प्रोसेसिंग शामिल होती है। एफ 2 को बार-बार कॉल करने और ओवरहेड/रिडंडेंसी/प्रसंस्करण आवश्यकताओं को बढ़ाने के बजाय, मैं परिणाम को एफ 1 में स्थिर चर में डाल देना चाहता हूं। हालांकि, किसी भी कारण से, यह मुझे फ़ंक्शन कॉल का उपयोग करके वैरिएबल को स्थिर के रूप में सेट करने की अनुमति नहीं देगा।

एक कोड उदाहरण:

function calledRepeatedly() { 
    static $dataset = loadDataset(); 
    // some minor processing here using the dataset 
    // and probably a loop 
    return "stuff"; 
} 
function loadDataset() { 
    //intensive dataset load code 
    //plus a database lookup or two 
    //whatever else 
    return array(
     "data1", 
     "data2" 
    ); 
} 

से काम नहीं होता। इसके परिणामस्वरूप एक त्रुटि - अप्रत्याशित '(', उम्मीद ',' या ';'

मुझे एहसास है कि यह काम करेगा, और इस प्रकार संदर्भ द्वारा पारित किया जाएगा इस प्रकार ओवरहेड को खत्म कर दिया जाएगा, हालांकि इसमें अतिरिक्त कार्य शामिल है सुनिश्चित करें कि वास्तव में तर्क सूची में डाटासेट है calledRepeatedly को कॉल करने की।

वहाँ किसी भी तरह से यह करने के लिए है?

+4

आप एक स्थिर चर में अभिव्यक्तियों को संग्रहीत नहीं कर सकते हैं। उन्हें संकलन समय पर हल किया जाता है ताकि फ़ंक्शन को अभी तक नहीं कहा जा सके। मुझे नहीं पता कि PHP स्थिर कार्यों का समर्थन करता है या नहीं। –

+0

कक्षा बनाने और इसे किसी संपत्ति में सहेजने के बारे में कैसे? ;-) – thedom

+0

@ मार्क, केवल कक्षाओं के भीतर। –

उत्तर

11

मैं loadDataset में स्थिर घोषणा फेंक चाहते हैं। मैंने डेटाबेस से डेटा रीफ्रेश करना है या नहीं, यह निर्धारित करने के लिए एक बूलियन जोड़ा है। मूल प्रक्रिया निम्नानुसार है: इसे स्थिर करने के बजाय, स्थिर चर को परिभाषित करें। फिर जांचें कि यह सेट है (या यदि $refresh सत्य पर सेट किया गया था)। यदि ऐसा नहीं है, तो डेटाबेस से गहन डेटा लोड करें।

function loadDataset($refresh = false) { 
    static $dataset; 
    if(!isset($dataset) || $refresh) 
    { 
     $dataset = array(); 
     //intensive dataset load code 
     //plus a database lookup or two 
     //whatever else 
    } 
    return $dataset; 
} 

संपादित करें: आप निश्चित रूप से अभी भी अपने मूल समारोह में static ... isset पैटर्न का उपयोग कर सकते हैं, लेकिन यह loadDataset में यह डाल करने के लिए क्लीनर लग रहा था।

+0

हालांकि यह क्लीनर हो सकता है, डेटासेट लोडिंग फ़ंक्शन पूरे स्क्रिप्ट में केवल एक डेटासेट से अधिक लोड करता है, जो कि गहन प्रसंस्करण के कारण * भाग * है (हालांकि अधिक प्रमुख आधा डेटाबेस परिणाम लोड और प्रसंस्करण कर रहा है), इसलिए मैं स्थैतिक का उपयोग कर रहे हैं ... मूल फ़ंक्शन में जारी करें क्योंकि दोनों डेटासेट एक ही लूप के भीतर उपयोग किए जाते हैं। यह निश्चित रूप से सबसे अच्छा तरीका है और एक फ़ंक्शन के लिए सबसे तार्किक है जो एक समय में एक डेटासेट लोड करता है, इसलिए मैंने आपके उत्तर को pygorex1 पर आसानी से स्वीकार कर लिया क्योंकि आपने क्लीनर तरीका की ओर इशारा किया :) – Nathaniel

+0

धन्यवाद :) इसके अलावा, 'isset' है) जहां तक ​​मुझे पता है) '$ डेटासेट' को असाइन किया गया है या नहीं, यह जांचने का न्यूनतम तरीका। 'खाली' काम नहीं करेगा, उदाहरण के लिए, आप उम्मीद करते हैं कि आपका डेटासेट कभी-कभी खाली सरणी हो।दुर्भाग्यवश, अपरिभाषित चर और चर के बीच अंतर करने का कोई तरीका नहीं है जो शून्य पर सेट हैं, या मैं इसके बजाय इसका उपयोग करता। – theazureshadow

+0

धन्यवाद @theazureshadow बहुत उपयोगी ... – atpatil11

3

आप एक स्थिर चर करने के लिए सीधे एक समारोह का परिणाम नहीं निर्दिष्ट कर सकते आप कर सकते हैं अभी भी रिटर्न वैल्यू को कैप्चर करें और स्थिर वैरिएबल को असाइन करें:

<?php 

function calledRepeatedly() { 
    static $dataset = false; 
    if (!$dataset) { 
     echo "dataset is empty, fetching data\n"; 
     $v = expensive(); 
     $dataset = $v; 
    } 
    echo "$dataset\n"; 
} 

function expensive() { 
    return 'complex data structure'; 
} 

calledRepeatedly(); 
calledRepeatedly(); 
calledRepeatedly(); 

आउटपुट:

dataset is empty, fetching data 
complex data structure 
complex data structure 
complex data structure 
0

जैसा कि @ मार्क ने टिप्पणी की, आप एक स्थैतिक चर को अभिव्यक्ति निर्दिष्ट नहीं कर सकते हैं। स्थैतिक चर का उपयोग करने की कोशिश करने के बजाय, परिणाम को स्टोर करने के लिए एपीसी जैसे किसी प्रकार के कैशिंग तंत्र का उपयोग करना बेहतर समाधान है।

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