2012-03-02 40 views
12

Tôi đang cố gắng xác định một hằng số, nhưng tôi không muốn xác định lại nó nếu nó đã được xác định. Đây là mẫu C:PHP có tương đương với #ifdef của C/C++ không?

#ifndef BASEPATH 
#define BASEPATH /mnt/www 
#endif 

Cách thanh lịch nhất để làm điều này trong PHP là gì?

+1

http://php.net/manual/en/function.defined.php – j08691

+0

Về mặt kỹ thuật, không, như 'define' /' defined' của PHP được đánh giá tại ** thời gian chạy ** (định nghĩa PHP gần giống như biến), và không có (builtin) ** preprocessor ** có khả năng vô hiệu hóa một loạt các dòng mã mà không đánh giá tính đúng đắn của cú pháp của nó (ví dụ, vô hiệu hóa cú pháp cú pháp sai với PHP 'if (defined (...)) 'sẽ không giúp ích gì). – leemes

Trả lời

23

Sử dụng defined()define().

if (!defined('BASEPATH')) { 
    define('BASEPATH', '/mnt/www'); 
} 
+2

Đẹp! Những gì tôi đã giải quyết trên là điều này (tất cả trong một dòng): 'định nghĩa ('BASE_PATH') || define ('BASE_PATH', '/ mnt/www /'); 'If' defined() 'là ** true **, phần còn lại của điều kiện không bao giờ được đánh giá, nếu' define() 'trả về ** false ** , nửa sau của điều kiện được đánh giá và 'BASE_PATH' được xác định. – DavidH

4

Sử dụng chức năng defined()

if(!defined("constantname")) { 
    define("constantname", "value"); 
} 
1

Sử dụng defined():

<?php 
/* Note the use of quotes, this is important. This example is checking 
* if the string 'TEST' is the name of a constant named TEST */ 
if (defined('TEST')) { 
    echo TEST; 
} 
?> 
1

Đây là viết lại cô đọng của câu trả lời Radu của trên (và của người khác).

defined('BASE_PATH') || define('BASE_PATH', '/mnt/www/');  

Vậy đó. Nếu defined('BASE_PATH') đánh giá là đúng, phần còn lại của điều kiện không bao giờ được đánh giá. Nếu nó trả về false, nửa sau của điều kiện được đánh giá và BASE_PATH được xác định.

+2

Tôi đề nghị phiên bản dài hơn, ngay cả khi trên một dòng, vì khả năng đọc được thêm sẽ có lợi trong thời gian dài ... 'if (! Defined ('BASE_PATH')) xác định ('BASE_PATH', '/ mnt/www/'); 'chỉ * 3 ký tự * dài hơn phiên bản được ngưng tụ này, và nó nhiều hơn là bù đắp cho nó dễ đọc. – rid

5

Trong C, #ifdef thường liên quan đến việc viết/bật/tắt mã tùy chỉnh dựa trên việc xác định có tồn tại hay không. Mặc dù OP không tìm kiếm câu trả lời sau, người dùng công cụ tìm kiếm có thể quan tâm để có được câu trả lời mở rộng. (Câu hỏi này đã giúp tôi RTM tìm câu trả lời sau.)

Nếu có tệp .php được bao gồm nhiều lần, có thể thuận tiện để khai báo hàm chỉ khi nó chưa được khai báo trước của cùng một tệp. Thuận tiện, trong trường hợp này, đang giữ mã có liên quan chặt chẽ trong cùng một tệp thay vì phải đặt mã trong một tệp riêng biệt include_once .php và mã riêng biệt không cần thiết thường không được sử dụng lại trong các ngữ cảnh khác (tệp).

Kể từ khi nó có vẻ lãng phí/không đúng với khai báo lại chức năng nhiều lần, nó chỉ ra rằng một # ifdef giống như cấu trúc trong PHP có thể:

if (! function_exists('myfunc')) 
{ 
    function myfunc(...) 
    { 
    ... 
    } 
} 

đâu ... chỉ fill-in-the của bạn chỗ trống.

Xem thêm: function_exists (PHP 4, PHP 5) (w/comments).

+0

Có vẻ như các biến toàn cục không được nhìn thấy từ bên trong myfunc(), vì vậy các tham chiếu phải được chuyển thành các đối số (khi cần). – kbulgrien

+0

mã của bạn không chính xác cú pháp – zerkms

+0

Có, tôi đã có dấu chấm phẩy ở cuối câu lệnh if (và nó đã biến mất) nhưng '...' được mô tả rõ ràng trong phần thân của câu trả lời. Mã này là một bản sao/dán của một cái gì đó trên một trang web thực sự, chỉ có tôi thay thế các đối số và chức năng cơ thể với '...' và thay đổi tên hàm. – kbulgrien

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