2009-09-05 29 views
24

tôi có xu hướng để có được các lỗi như:PHP: cách tránh các chức năng redeclaring?

Fatal error: Cannot redeclare get_raw_data_list() (previously declared in /var/www/codes/handlers/make_a_thread/get_raw_data_list.php:7) in /var/www/codes/handlers/make_a_thread/get_raw_data_list.php on line 19

làm thế nào tôi có thể tránh được những lỗi? Có thể tạo mệnh đề IF để kiểm tra xem một hàm được khai báo trước khi khai báo nó hay không?

Trả lời

27

Sử dụng require_once hoặc include_once thay vì include hoặc require khi bao gồm các tệp chứa chức năng của bạn.

Các _once anh chị em của includerequire sẽ buộc PHP để kiểm tra xem các tập tin đã được bao gồm/yêu cầu, và nếu như vậy, không include/require nó một lần nữa, do đó ngăn cản "không thể redeclare x chức năng ... 'lỗi nghiêm trọng.

+0

Điều này tiết kiệm cuộc sống! –

+1

@ karim79: Tôi chúc bạn những điều tốt đẹp nhất trong cuộc đời bạn. –

+3

Mặc dù câu trả lời của karim79 có thể khắc phục được sự cố của op nhưng nó không thực sự giải quyết vấn đề. Tôi nghĩ câu trả lời của Dooltaz làm đúng. –

68
if(!function_exists("get_raw_data_list")) { 
... define function here ... 
} 

http://us.php.net/function_exists

+1

Điều này có thể hữu ích cho các polyfills, tức là khi bạn muốn thêm một hàm vào một phiên bản cũ hơn của php được giới thiệu trong các phiên bản mới hơn của php. Trong trường hợp đó 'require_once' không thể tránh va chạm. – CodesInChaos

+0

Xin lưu ý rằng mã này phải được ** thêm ** trước ** sử dụng ** của hàm – MujtabaFR

7

"function_exists" sẽ cho bạn biết nếu một chức năng đã được công bố. Mặc dù tôi nghi ngờ có thể bạn có vấn đề với việc bao gồm các tệp nhiều lần. Khi bạn bao gồm một tệp, bạn đang sử dụng require_once hoặc include_once hoặc chỉ yêu cầu/bao gồm?

+0

Về mặt kỹ thuật, điều đó không hoàn toàn chính xác. Một hàm PHP có thể không tồn tại, nhưng vẫn _declared_. ví dụ. 'function_exists' sẽ trả về' false' cho bất kỳ hàm nào được định nghĩa trong 'disable_functions' của cấu hình PHP. Tuy nhiên, những hàm đó vẫn là _declared_. – fritzmg

4

Nếu bạn đang đối phó với Lớp học method_exists() có thể là những gì bạn đang tìm kiếm:

if(!method_exists(__CLASS__, 'function_name')){ 
    function function_name(){ 

    } 
} 

này sẽ kiểm tra các lớp hiện tại để làm cho rằng chức năng function_name không tồn tại trước khi cố gắng để khai báo nó