2011-09-25 15 views
7

मैं इस php स्क्रिप्ट है:समारोह redeclare नहीं कर सकते

function hoeveelzijner ($jaar, $id) 
{ 
      function hoeveelhoeveel($beginstamp, $endstamp, $id) 
      { 
       $dates = mysql_query('SELECT v_date FROM visitors WHERE id="'.$id.'" AND v_date<"'.$endstamp.'" AND v_date>"'.$beginstamp.'"'); 
       return mysql_num_rows($dates); 
      } 
$i = 1; 
while ($i < 13) 
{ 
    $hoeveel[$i-1] = hoeveelhoeveel(mktime(0, 0, 0, $i, 1, $jaar),mktime(0, 0, 0, $i, cal_days_in_month(CAL_GREGORIAN,$i,$jaar),$jaar),$id); 
    $i = $i+1; 
} 
return $hoeveel; 
} 

जब मैंने इसे नीचे डाल, यह सिर्फ ठीक काम करता है:

$values = hoeveelzijner(2005, 1); 

हालांकि, जब मैं करता हूँ इसे दो बार, उदाहरण के लिए:

$values = hoeveelzijner(2005, 1); 
$test = hoeveelzijner(2000, 4); 

मैं इस त्रुटि मिलती है: गंभीर त्रुटि: hoeveelhoeveel() redeclare नहीं कर सकता (पहले में घोषित ...: 69) में ... लाइन 69 पर

कोई भी जानता है कि मैं क्या गलत कर रहा हूं? यह थोड़े कार्यों का उपयोग करने के उद्देश्य को नष्ट कर देता है अगर मैं इसे केवल एक बार उपयोग कर सकता हूं ...

अतिरिक्त जानकारी: मुझे कोई अन्य फाइल शामिल नहीं है, और न ही मैं स्क्रिप्ट में कहीं और फ़ंक्शन को फिर से चलाता हूं।

बहुत बहुत धन्यवाद!

+1

इसे देखें: http://stackoverflow.com/questions/1398801/php-function-inside-a-function-good-or-bad –

उत्तर

12

आप केवल का उपयोग कर सकते हैं; आप केवल इसे एक बार घोषित कर सकते हैं। प्रत्येक बार फ़ंक्शन hoeveelzijner का उपयोग किया जाता है, फ़ंक्शन hoeveelhoeveel घोषित किया जाता है। यदि आप इसे एक से अधिक बार कहते हैं, तो आप इसे फिर से शुरू कर देंगे, जिसे प्रतिबंधित किया गया है।

आपके पास दो विकल्प हैं: पहला कार्य फ़ंक्शन के बाहर फ़ंक्शन परिभाषा लेना है। फ़ंक्शन घोषित किया जाएगा जब फ़ाइल को पहली बार पार्स किया जाएगा, फिर बार-बार उपयोग किया जाता है। आप एक विशेष गुंजाइश के लिए समारोह परिभाषा (सिद्धांत रूप में एक अच्छा विचार) को प्रतिबंधित करना चाहते हैं, तो आप गुमनाम समारोह वाक्य रचना पीएचपी 5.3 में पेश उपयोग कर सकते हैं:

function hoeveelzigner($jaar, $id) 
{ 
    $hoeveelhoeveel = function($beginstamp, $endstamp, $id) 
    { 
      $dates = mysql_query('SELECT v_date FROM visitors WHERE id="'.$id.'" AND v_date<"'.$endstamp.'" AND v_date>"'.$beginstamp.'"'); 
      return mysql_num_rows($dates); 
    }; 

    // etc 
} 

फिर आप $hoeveelhoeveel(...) के रूप में कार्य कर सकते हैं।

+0

उत्कृष्ट पोस्ट के लिए धन्यवाद। मैं इसके साथ भी संघर्ष कर रहा था, और एकमात्र समाधान जो मुझे मिल सकता था [यह] (http://www.php.net/manual/en/language.functions.php#21150), जिसे PHP पर नकारात्मक रेटिंग मिली .net। और अब मैं देखता हूं क्यों :) – EleventyOne

0

हालांकि PHP आप किसी भी समारोह को घोषित करते हैं, मुझे लगता है कि आप जो भी कर रहे हैं उसे सर्वोत्तम अभ्यास नहीं माना जाता है।

ज्यादातर लोगों के लिए यह गलत लगता है।

आपको केवल पैरेंट फ़ंक्शन के बाहर फ़ंक्शन घोषित करना चाहिए।

वैकल्पिक रूप से आप आंतरिक फ़ंक्शन के आस-पास function_exists() जोड़ सकते हैं, फिर भी मैं केवल मूल कार्य के बाहर आंतरिक फ़ंक्शन घोषित करूंगा।

शायद इसके लिए भी कक्षा बना सकते हैं।

0

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

function hoeveelhoeveel($beginstamp, $endstamp, $id) 

    $dates = mysql_query('SELECT v_date FROM visitors WHERE id="'.$id.'" AND v_date<"'.$endstamp.'" AND v_date>"'.$beginstamp.'"'); 
    return mysql_num_rows($dates); 
} 

function hoeveelzijner ($jaar, $id) 
{ 
    $i = 1; 
    while ($i < 13) 
    { 
     $hoeveel[$i-1] = hoeveelhoeveel(mktime(0, 0, 0, $i, 1, $jaar),mktime(0, 0, 0, $i, cal_days_in_month(CAL_GREGORIAN,$i,$jaar),$jaar),$id); 
     $i = $i+1; 
    } 
    return $hoeveel; 
} 

फिर यदि आवश्यक हो तो आप अन्य कार्यों में भी किसी भी तरह से फ़ंक्शन को कॉल कर सकते हैं।

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