2011-09-25 23 views
7

Tôi có kịch bản php này:chức năng bên trong hàm trong php: Lỗi: Không thể 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; 
} 

Khi tôi đặt này bên dưới nó, nó hoạt động tốt:

$values = hoeveelzijner(2005, 1); 

Tuy nhiên, khi tôi làm nó hai lần, ví dụ:

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

tôi nhận được lỗi này: Fatal error: không thể redeclare hoeveelhoeveel() (trước đây tuyên bố trong ...: 69) trong ... trên dòng 69.

Có ai biết tôi đang làm gì sai không? Nó sẽ phá hủy mục đích sử dụng các chức năng nếu tôi chỉ có thể sử dụng nó một lần ...

Thông tin bổ sung: Tôi không bao gồm bất kỳ tệp nào khác, cũng như không redeclare chức năng ở nơi khác trong tập lệnh.

Cảm ơn rất nhiều!

+1

Xem nội dung này: http://stackoverflow.com/questions/1398801/php-function-inside-a-function-good-or-bad –

Trả lời

12

Bạn không thể chỉ sử dụng một lần; bạn chỉ có thể khai báo một lần. Mỗi khi hàm hoeveelzijner được sử dụng, hàm hoeveelhoeveel được khai báo. Nếu bạn gọi nó nhiều hơn một lần, bạn sẽ redeclare nó, đó là bị cấm.

Bạn có hai tùy chọn: đầu tiên là lấy định nghĩa hàm bên ngoài hàm chứa. Hàm sẽ được khai báo khi tệp được phân tích cú pháp đầu tiên, sau đó được sử dụng nhiều lần. Nếu bạn muốn hạn chế các định nghĩa hàm đến một phạm vi cụ thể (một ý tưởng tốt về nguyên tắc), bạn có thể sử dụng chức năng cú pháp mang tính chất giới thiệu trong PHP 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 
} 

Sau đó bạn có thể sử dụng các chức năng như $hoeveelhoeveel(...).

+0

Cảm ơn bài đăng tuyệt vời. Tôi đã đấu tranh với điều này là tốt, và giải pháp duy nhất tôi có thể tìm thấy là [this] (http://www.php.net/manual/en/language.functions.php#21150), mà nhận được một đánh giá tiêu cực trên php .mạng lưới. Và bây giờ tôi thấy tại sao :) – EleventyOne

0

Mặc dù PHP cho phép bạn khai báo một hàm ở bất kỳ nơi nào tôi nghĩ những gì bạn đang làm không được coi là thực hành tốt nhất.

Đối với hầu hết mọi người, nó chỉ trông sai.

Bạn chỉ cần khai báo hàm bên ngoài hàm gốc.

Hoặc bạn có thể thêm function_exists() xung quanh hàm bên trong, mặc dù một lần nữa tôi sẽ chỉ khai báo hàm bên trong bên ngoài hàm cha.

Có lẽ thậm chí là tạo một lớp cho nó.

0

Bạn không thể khai báo lại, đặc biệt nếu hàm gọi nhiều lần. Đây là một thay đổi đơn giản nên hoạt động.

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; 
} 

Sau đó, bạn cũng có thể gọi hàm theo cách tương tự trong các chức năng khác, nếu cần.

Các vấn đề liên quan