Sử dụng define() và const để tạo hằng số trong PHP
PHP Tutorial | by
Hằng số là những giá trị cố định, một khi đã được định nghĩa thì không thể gán lại hoặc thay đổi. Chúng giống như những quy tắc, những con số "chuẩn" mà chương trình của bạn sẽ dựa vào. PHP cung cấp hai cách chính để tạo ra hằng số: sử dụng hàm define()
và từ khóa const
.
Vậy hai cách này khác nhau như thế nào? Khi nào thì nên dùng define()
và khi nào thì const
là lựa chọn tốt hơn? Bài viết này sẽ giúp bạn hiểu rõ về hằng số trong PHP, tìm kiếm chi tiết cách sử dụng define()
và const
, đồng thời so sánh ưu nhược điểm của từng phương pháp để bạn có thể áp dụng chúng một cách hiệu quả nhất trong các dự án của mình.
Hằng số là gì?
Khi bạn bắt đầu học lập trình, khái niệm đầu tiên về việc lưu trữ dữ liệu là biến. Nhưng không phải mọi giá trị đều cần linh hoạt như biến. Đôi khi, bạn muốn có những giá trị "cố định" và "không thể thay đổi". Đó chính là lúc hằng số phát huy tác dụng.
Nhắc lại về biến
Trong PHP, một biến là một vùng lưu trữ dữ liệu mà giá trị của nó có thể thay đổi trong suốt quá trình chương trình chạy. Bạn có thể gán cho nó một giá trị, sau đó thay đổi giá trị đó bất cứ lúc nào.
-
Ví dụ:
<?php $age = 30; // Biến $age ban đầu có giá trị là 30 echo "Tuổi hiện tại: " . $age . "<br>"; $age = 31; // Giá trị của $age đã được thay đổi thành 31 echo "Tuổi sau 1 năm: " . $age . "<br>"; ?>
-
Như bạn thấy,
$age
có thể được cập nhật giá trị một cách dễ dàng.
Hằng số là gì?
Ngược lại với biến, một hằng số là một "biến" đặc biệt mà giá trị của nó được cố định và không thể thay đổi sau khi đã được định nghĩa. Một khi bạn đã gán một giá trị cho hằng số, giá trị đó sẽ giữ nguyên cho đến khi chương trình kết thúc.
- Khái niệm: Hãy nghĩ hằng số như một "giá trị không đổi" mà bạn có thể dùng đi dùng lại trong chương trình của mình. Ví dụ, số Pi (piapprox3.14159) là một hằng số trong toán học vì giá trị của nó không bao giờ thay đổi.
- Bạn không thể gán lại một giá trị mới cho một hằng số sau khi nó đã được định nghĩa. Nếu cố gắng làm vậy, PHP sẽ báo lỗi.
Tại sao cần hằng số?
Việc sử dụng hằng số mang lại nhiều lợi ích quan trọng trong lập trình:
Tính nhất quán (Consistency): Hằng số giúp đảm bảo rằng một giá trị quan trọng (như tỷ lệ thuế, tên cơ sở dữ liệu, hoặc URL gốc của trang web) không bị vô tình thay đổi ở bất kỳ đâu trong code. Điều này ngăn ngừa lỗi phát sinh do việc gán sai giá trị.
Dễ bảo trì (Maintainability): Nếu bạn có một giá trị được sử dụng ở nhiều nơi trong chương trình và giá trị đó cần thay đổi trong tương lai (ví dụ: tên website, địa chỉ email quản trị), bạn chỉ cần sửa đổi ở một chỗ duy nhất – nơi bạn định nghĩa hằng số. Điều này tiết kiệm thời gian và giảm thiểu rủi ro bỏ sót.
- Ví dụ: Imagine bạn có 20 file PHP sử dụng tên website
My Website
. Nếu bạn dùng biến, bạn phải đi sửa ở 20 chỗ. Nếu dùng hằng sốWEBSITE_NAME
, bạn chỉ sửadefine('WEBSITE_NAME', 'My Website mới');
ở file cấu hình.
Dễ đọc (Readability): Tên hằng số thường được viết bằng chữ IN HOA TOÀN BỘ, giúp chúng nổi bật và dễ nhận biết ngay lập tức trong code. Điều này làm cho code dễ hiểu hơn về mục đích của một giá trị.
echo "Welcome to " . WEBSITE_NAME;
dễ hiểu hơn nhiều so vớiecho "Welcome to " . $site_title;
nếu bạn không biết$site_title
là gì.
Hiệu suất (Performance): Mặc dù sự khác biệt có thể nhỏ, PHP có thể tối ưu hóa việc truy cập hằng số tốt hơn so với biến, vì trình biên dịch biết rằng giá trị của hằng số sẽ không thay đổi.
Các trường hợp sử dụng phổ biến:
- Tên website hoặc ứng dụng:
define('APP_NAME', 'My Awesome App');
- Đường dẫn thư mục gốc:
define('ROOT_PATH', '/var/www/html/my_app/');
- Thông tin kết nối cơ sở dữ liệu:
define('DB_HOST', 'localhost');
,define('DB_USER', 'root');
- Tỷ giá, thuế suất, giới hạn:
define('TAX_RATE', 0.1);
,define('MAX_UPLOAD_SIZE', 2048);
- Mã lỗi, trạng thái:
define('STATUS_SUCCESS', 1);
,define('ERROR_NOT_FOUND', 404);
Quy tắc đặt tên hằng số
Để tăng tính dễ đọc và phân biệt hằng số với biến, có một quy tắc đặt tên được cộng đồng lập trình PHP khuyến nghị và sử dụng rộng rãi:
Tên hằng số thường được viết bằng chữ IN HOA TOÀN BỘ.
Nếu tên hằng số có nhiều từ, các từ đó được cách nhau bằng dấu gạch dưới (_
).
Ví dụ:
MAX_CONNECTIONS
SITE_URL
DEFAULT_LANGUAGE
USER_ROLE_ADMIN
Việc tuân thủ quy tắc này giúp code của bạn nhất quán và dễ đọc hơn rất nhiều cho bất kỳ ai làm việc với nó.
Tạo hằng số bằng define()
trong PHP
PHP cung cấp hàm define()
là một trong những cách phổ biến và lâu đời nhất để tạo hằng số. Đây là một hàm linh hoạt, đặc biệt hữu ích khi bạn cần định nghĩa hằng số trong các điều kiện cụ thể.
Cú pháp
Để tạo một hằng số bằng hàm define()
, bạn sử dụng cú pháp sau:
define('TEN_HANG_SO', gia_tri);
'TEN_HANG_SO'
: Đây là tên của hằng số mà bạn muốn định nghĩa. Tên này phải được đặt trong dấu nháy đơn hoặc kép vì nó được truyền dưới dạng một chuỗi. Theo quy ước, tên hằng số thường được viết hoa toàn bộ và dùng dấu gạch dưới (_
) để phân tách các từ (ví dụ: SITE_NAME
, MAX_USERS
).
gia_tri
: Đây là giá trị mà bạn muốn gán cho hằng số. Giá trị này có thể là:
- Số (nguyên hoặc thực):
10
,3.14
. - Chuỗi:
"Hello World"
,"[email protected]"
. - Boolean:
true
,false
. - NULL.
- Mảng (từ PHP 5.6 trở lên).
- Giá trị của một biểu thức hoặc kết quả của một hàm (từ PHP 5.3 trở lên).
Lưu ý về phân biệt chữ hoa chữ thường: Theo mặc định, tên hằng số được tạo bằng define()
phân biệt chữ hoa chữ thường. Điều này có nghĩa là MY_CONSTANT
và my_constant
sẽ được coi là hai hằng số khác nhau.
Bạn có thể thay đổi hành vi này bằng cách thêm một tham số thứ ba là true
vào hàm define()
(từ PHP 7.3 trở về trước). Tuy nhiên, từ PHP 7.3, việc này đã bị cảnh báo (deprecated) và từ PHP 8.0, tham số này không còn tác dụng và hằng số luôn phân biệt chữ hoa chữ thường. Vì vậy, tốt nhất là luôn coi hằng số phân biệt chữ hoa chữ thường.
<?php define('MY_CONSTANT', 'Giá trị của tôi'); define('MY_constant', 'Giá trị khác'); // Đây là một hằng số khác! echo MY_CONSTANT . "<br>"; // Output: Giá trị của tôi echo MY_constant . "<br>"; // Output: Giá trị khác // Ví dụ về tham số thứ 3 (chỉ có ý nghĩa với PHP < 7.3) // define('CASE_INSENSITIVE_CONST', 'Hello', true); // echo CASE_INSENSITIVE_CONST . "<br>"; // Hello // echo case_insensitive_const . "<br>"; // Hello (chỉ với PHP < 7.3) ?>
Ví dụ cơ bản
Hãy xem cách bạn định nghĩa và sử dụng hằng số cho các thông tin phổ biến như tên website hay email quản trị:
<?php // Định nghĩa hằng số cho tên website define('WEBSITE_NAME', 'Shop Đồ Công Nghệ'); // Định nghĩa hằng số cho email quản trị define('ADMIN_EMAIL', '[email protected]'); // Định nghĩa một hằng số số học define('MAX_ITEMS_PER_PAGE', 20); // Sử dụng các hằng số đã định nghĩa echo "Chào mừng bạn đến với " . WEBSITE_NAME . "!<br>"; echo "Mọi thắc mắc xin gửi về: " . ADMIN_EMAIL . "<br>"; echo "Số sản phẩm tối đa mỗi trang: " . MAX_ITEMS_PER_PAGE . "<br>"; // Cố gắng thay đổi giá trị hằng số (sẽ báo lỗi Fatal error) // define('WEBSITE_NAME', 'Tên mới'); // Lỗi: Constant WEBSITE_NAME already defined // WEBSITE_NAME = 'Tên khác'; // Lỗi: Cannot assign to a constant ?>
Tạo hằng số bằng define()
trong PHP
PHP cung cấp hàm define()
là một trong những cách phổ biến và lâu đời nhất để tạo hằng số. Đây là một hàm linh hoạt, đặc biệt hữu ích khi bạn cần định nghĩa hằng số trong các điều kiện cụ thể.
Cú pháp
Để tạo một hằng số bằng hàm define()
, bạn sử dụng cú pháp sau:
define('TEN_HANG_SO', gia_tri);
'TEN_HANG_SO'
: Đây là tên của hằng số mà bạn muốn định nghĩa. Tên này phải được đặt trong dấu nháy đơn hoặc kép vì nó được truyền dưới dạng một chuỗi. Theo quy ước, tên hằng số thường được viết hoa toàn bộ và dùng dấu gạch dưới (_
) để phân tách các từ (ví dụ: SITE_NAME
, MAX_USERS
).
gia_tri
: Đây là giá trị mà bạn muốn gán cho hằng số. Giá trị này có thể là:
- Số (nguyên hoặc thực):
10
,3.14
. - Chuỗi:
"Hello World"
,"[email protected]"
. - Boolean:
true
,false
. - NULL.
- Mảng (từ PHP 5.6 trở lên).
- Giá trị của một biểu thức hoặc kết quả của một hàm (từ PHP 5.3 trở lên).
Lưu ý về phân biệt chữ hoa chữ thường: Theo mặc định, tên hằng số được tạo bằng define()
phân biệt chữ hoa chữ thường. Điều này có nghĩa là MY_CONSTANT
và my_constant
sẽ được coi là hai hằng số khác nhau.
Bạn có thể thay đổi hành vi này bằng cách thêm một tham số thứ ba là true
vào hàm define()
(từ PHP 7.3 trở về trước). Tuy nhiên, từ PHP 7.3, việc này đã bị cảnh báo (deprecated) và từ PHP 8.0, tham số này không còn tác dụng và hằng số luôn phân biệt chữ hoa chữ thường. Vì vậy, tốt nhất là luôn coi hằng số phân biệt chữ hoa chữ thường.
Khi bạn chạy đoạn code trên, PHP sẽ báo lỗi nếu bạn cố gắng định nghĩa lại WEBSITE_NAME
, xác nhận rằng hằng số không thể thay đổi giá trị sau khi đã được tạo.
Phạm vi (Scope)
Một đặc điểm nổi bật của hằng số được tạo bằng define()
là chúng có phạm vi toàn cục (global scope). Điều này có nghĩa là bạn có thể truy cập hằng số đó từ bất kỳ đâu trong code của mình, dù là bên trong một hàm, một lớp, hay ngay cả trong những phần code nằm ngoài bất kỳ khối lệnh nào.
-
Ví dụ minh họa phạm vi toàn cục:
<?php define('DATABASE_NAME', 'my_app_db'); // Định nghĩa hằng số ở phạm vi toàn cục function connectToDatabase() { // Hằng số DATABASE_NAME có thể truy cập được bên trong hàm echo "Đang kết nối đến cơ sở dữ liệu: " . DATABASE_NAME . "<br>"; } class Configuration { public function getDbName() { // Hằng số DATABASE_NAME cũng có thể truy cập được bên trong phương thức của lớp return DATABASE_NAME; } } connectToDatabase(); // Gọi hàm $config = new Configuration(); echo "Tên DB từ lớp: " . $config->getDbName() . "<br>"; echo "Tên DB trực tiếp: " . DATABASE_NAME . "<br>"; ?>
Đây là một ưu điểm lớn của define()
khi bạn cần các giá trị cấu hình chung cho toàn bộ ứng dụng.
Khả năng định nghĩa động (Runtime)
Một khả năng độc đáo của define()
là bạn có thể định nghĩa hằng số trong thời gian chạy (runtime). Điều này có nghĩa là bạn có thể đặt lệnh define()
bên trong các câu lệnh điều kiện (if/else
), vòng lặp (for
/while
), hoặc bên trong các hàm. Hằng số sẽ chỉ được định nghĩa khi điều kiện đó được thỏa mãn hoặc hàm đó được gọi.
-
Ví dụ minh họa định nghĩa động:
<?php $environment = "development"; // Giả sử đây là chế độ môi trường hiện tại if ($environment == "development") { define('DEBUG_MODE', true); // Hằng số chỉ được định nghĩa nếu ở chế độ phát triển define('ERROR_LOG_PATH', '/var/log/app_dev_errors.log'); } else { define('DEBUG_MODE', false); // Hằng số sẽ có giá trị khác nếu ở chế độ production define('ERROR_LOG_PATH', '/var/log/app_prod_errors.log'); } // Sau khi định nghĩa, bạn có thể sử dụng chúng if (DEBUG_MODE) { echo "Ứng dụng đang chạy ở chế độ DEBUG.<br>"; echo "Lưu log tại: " . ERROR_LOG_PATH . "<br>"; } else { echo "Ứng dụng đang chạy ở chế độ PRODUCTION.<br>"; echo "Lưu log tại: " . ERROR_LOG_PATH . "<br>"; } // Một ví dụ khác: Định nghĩa trong hàm function setUserIdConst($id) { if (!defined('USER_ID')) { // Kiểm tra xem hằng số đã được định nghĩa chưa define('USER_ID', $id); echo "Hằng số USER_ID đã được định nghĩa là: " . USER_ID . "<br>"; } else { echo "Hằng số USER_ID đã tồn tại: " . USER_ID . "<br>"; } } setUserIdConst(123); // Lần gọi đầu tiên, định nghĩa hằng số setUserIdConst(456); // Lần gọi thứ hai, hằng số đã tồn tại, không định nghĩa lại ?>
Khả năng này rất hữu ích cho các cấu hình động, nơi bạn muốn các giá trị hằng số phụ thuộc vào môi trường chạy hoặc các điều kiện khác.
Tạo hằng số bằng const
trong PHP
Ngoài hàm define()
, PHP còn cung cấp từ khóa const
để tạo hằng số. Từ khóa const
thường được ưu tiên dùng hơn trong các trường hợp thông thường nhờ cú pháp gọn gàng và khả năng tích hợp tốt với lập trình hướng đối tượng.
Cú pháp
Để tạo một hằng số bằng từ khóa const
, bạn sử dụng cú pháp sau:
const TEN_HANG_SO = gia_tri;
const
: Đây là từ khóa để khai báo một hằng số.
TEN_HANG_SO
: Đây là tên của hằng số. Khác với define()
, tên hằng số khi dùng const
không cần đặt trong dấu nháy đơn hoặc kép vì const
là một từ khóa khai báo, không phải một hàm. Theo quy ước, tên hằng số cũng được viết hoa toàn bộ và dùng dấu gạch dưới (_
) để phân tách các từ (ví dụ: MAX_AGE
, DEFAULT_CURRENCY
).
gia_tri
: Đây là giá trị của hằng số. Giá trị này phải là một giá trị tĩnh (static value) hoặc một biểu thức hằng số (constant expression), nghĩa là giá trị phải được biết tại thời điểm biên dịch (compile-time), không phải thời điểm chạy (runtime).
- Giá trị có thể là: số (nguyên, thực), chuỗi, boolean,
NULL
. - Từ PHP 5.6, bạn có thể gán mảng đơn giản (chứa các giá trị tĩnh).
- Bạn không thể gán kết quả của một hàm, một đối tượng, hoặc một biến cho hằng số
const
(trừ một số trường hợp đặc biệt với biểu thức hằng số từ PHP 7 trở lên).
Lưu ý: Tên hằng số tạo bằng const
luôn phân biệt chữ hoa chữ thường. Điều này có nghĩa là PI_VALUE
và pi_value
sẽ được PHP coi là hai hằng số hoàn toàn khác nhau.
Ví dụ cơ bản
Hãy xem cách bạn định nghĩa và sử dụng hằng số bằng const
ở cấp độ tệp (ngoài bất kỳ lớp hoặc hàm nào):
<?php // Định nghĩa hằng số cho phiên bản ứng dụng const APP_VERSION = "1.0.0"; // Định nghĩa hằng số cho số lượng người dùng tối đa const MAX_USERS = 1000; // Định nghĩa một hằng số kiểu boolean const IS_DEBUG_MODE = true; // Định nghĩa một hằng số là mảng (từ PHP 5.6 trở lên) const ALLOWED_ROLES = ['admin', 'editor', 'viewer']; // Sử dụng các hằng số đã định nghĩa echo "Phiên bản ứng dụng: " . APP_VERSION . "<br>"; echo "Số người dùng tối đa: " . MAX_USERS . "<br>"; if (IS_DEBUG_MODE) { echo "Chế độ debug đang BẬT.<br>"; } else { echo "Chế độ debug đang TẮT.<br>"; } echo "Các vai trò được phép: " . implode(', ', ALLOWED_ROLES) . "<br>"; // Cố gắng thay đổi giá trị hằng số (sẽ báo lỗi Fatal error) // const APP_VERSION = "2.0.0"; // Lỗi: Cannot redeclare constant APP_VERSION // APP_VERSION = "2.0.0"; // Lỗi: Cannot assign to a constant ?>
Khi bạn chạy đoạn code trên, bạn sẽ thấy rằng các hằng số được định nghĩa và sử dụng bình thường, nhưng PHP sẽ ngăn cản bạn thay đổi giá trị của chúng.
Phạm vi (Scope)
Phạm vi của hằng số tạo bằng const
phụ thuộc vào vị trí bạn định nghĩa nó:
Phạm vi cấp tệp (File-level Scope): Nếu bạn định nghĩa hằng số const
trực tiếp trong một tệp PHP (bên ngoài bất kỳ lớp hoặc hàm nào), nó sẽ có phạm vi toàn bộ tệp đó. Tức là, bạn có thể truy cập hằng số đó ở bất kỳ đâu trong cùng một tệp, bao gồm cả bên trong các hàm hoặc lớp được định nghĩa trong tệp đó.
- Lưu ý: Mặc dù về mặt kỹ thuật, nó có thể truy cập được từ các tệp khác nếu tệp chứa hằng số được
include
hoặcrequire
, nhưng phạm vi "chính thức" của nó là tệp chứa định nghĩa.
Phạm vi cấp lớp (Class-level Scope) - "Class Constant": Đây là một trong những điểm mạnh của const
so với define()
. Bạn có thể định nghĩa hằng số bên trong một lớp. Những hằng số này thuộc về lớp đó và được gọi là hằng số lớp (class constants). Chúng rất hữu ích để định nghĩa các giá trị cố định liên quan đến một lớp cụ thể.
Để truy cập hằng số lớp, bạn sử dụng toán tử phạm vi kép ::
với tên lớp: TEN_LOP::TEN_HANG_SO
.
Ví dụ minh họa phạm vi:
<?php // Hằng số cấp tệp const FILE_MAX_UPLOAD_SIZE = 5 * 1024 * 1024; // 5 MB function checkUploadSize($fileSize) { // Hằng số cấp tệp có thể truy cập bên trong hàm if ($fileSize > FILE_MAX_UPLOAD_SIZE) { echo "Kích thước tệp vượt quá giới hạn ($fileSize bytes > " . FILE_MAX_UPLOAD_SIZE . " bytes).<br>"; return false; } echo "Tệp có kích thước hợp lệ.<br>"; return true; } class Database { // Hằng số cấp lớp const DEFAULT_PORT = 3306; const DB_TYPE = "MySQL"; public function getConnectionInfo() { // Hằng số lớp được truy cập bằng self:: echo "Kết nối tới " . self::DB_TYPE . " trên cổng " . self::DEFAULT_PORT . "<br>"; } } // Sử dụng hằng số cấp tệp checkUploadSize(6000000); // Kích thước tệp vượt quá giới hạn... checkUploadSize(2000000); // Tệp có kích thước hợp lệ. // Sử dụng hằng số cấp lớp $db = new Database(); $db->getConnectionInfo(); // Output: Kết nối tới MySQL trên cổng 3306 // Truy cập hằng số lớp trực tiếp từ bên ngoài lớp echo "Cổng MySQL mặc định: " . Database::DEFAULT_PORT . "<br>"; // Output: Cổng MySQL mặc định: 3306 ?>
Hạn chế định nghĩa động (Compile-time)
Đây là một điểm khác biệt lớn và quan trọng giữa const
và define()
. Hằng số được tạo bằng từ khóa const
phải được định nghĩa tại thời điểm biên dịch (compile-time). Điều này có nghĩa là giá trị của chúng phải được biết trước khi code được thực thi.
Bạn không thể định nghĩa hằng số const
bên trong các khối lệnh có điều kiện hoặc động như:
- Câu lệnh
if
/else
- Hàm (
function
) - Vòng lặp (
for
,while
,foreach
) - Khối
try-catch
Nếu bạn cố gắng làm vậy, PHP sẽ báo lỗi Parse error
hoặc Fatal error
.
-
Ví dụ minh họa (code sai):
<?php // Ví dụ sai: Không thể định nghĩa const trong if/else $env = "dev"; // if ($env == "dev") { // const APP_ENV = "DEVELOPMENT"; // LỖI: Parse error // } else { // const APP_ENV = "PRODUCTION"; // LỖI: Parse error // } // Ví dụ sai: Không thể định nghĩa const trong hàm // function setupConfig() { // const DB_PASS = "secure_pass"; // LỖI: Parse error // } // Ví dụ sai: Không thể định nghĩa const trong vòng lặp // for ($i = 0; $i < 5; $i++) { // const ITERATION_LIMIT = 10; // LỖI: Parse error // } // Đây là cách ĐÚNG để định nghĩa const (ngoài các khối lệnh động) const MAX_ATTEMPTS = 3; echo "Số lần thử tối đa: " . MAX_ATTEMPTS . "<br>"; ?>
Hạn chế này đảm bảo rằng các hằng số const
là thực sự cố định và không thay đổi theo luồng thực thi của chương trình. Nếu bạn cần hằng số phụ thuộc vào điều kiện, define()
là lựa chọn phù hợp.
So Sánh define()
và const
trong PHP
Bạn đã tìm hiểu chi tiết về cách sử dụng define()
và const
để tạo hằng số trong PHP. Bây giờ, hãy đặt chúng cạnh nhau để xem sự khác biệt chính và hiểu rõ khi nào nên ưu tiên dùng phương pháp nào.
Dưới đây là bảng so sánh tổng quan các đặc điểm của define()
và const
:
Dưới đây là bảng so sánh tổng quan các đặc điểm của define()
và const
:
Khi nào nên dùng cái nào?
Việc lựa chọn giữa define()
và const
thường dựa trên ngữ cảnh và yêu cầu cụ thể của bạn.
Sử dụng const
khi (trường hợp phổ biến và được ưu tiên):
Ví dụ nên dùng const
:
- Bạn cần định nghĩa một hằng số có giá trị cố định và không thay đổi trong suốt vòng đời của script. Đây là trường hợp phổ biến nhất.
- Bạn muốn hằng số được định nghĩa trực tiếp trong code (không phụ thuộc vào điều kiện).
- Bạn đang làm việc với lập trình hướng đối tượng (OOP) và muốn định nghĩa các hằng số thuộc về một lớp cụ thể (hằng số lớp). Cú pháp
const
gọn gàng và tự nhiên hơn trong ngữ cảnh này. - Bạn muốn có một chút hiệu suất tốt hơn (mặc dù sự khác biệt là rất nhỏ trong hầu hết các ứng dụng).
- Code của bạn đang nhắm mục tiêu các phiên bản PHP hiện đại (PHP 5.3 trở lên).
<?php // Hằng số cấp tệp, không thay đổi const APP_NAME = "My Awesome Application"; const DEFAULT_LANGUAGE = "en"; const MAX_ITEMS_PER_PAGE = 25; class UserStatus { // Hằng số lớp, thuộc về lớp UserStatus const ACTIVE = 1; const INACTIVE = 0; const PENDING = 2; } echo APP_NAME . "<br>"; echo "Trạng thái người dùng Active: " . UserStatus::ACTIVE . "<br>"; ?>
Sử dụng define()
khi (trường hợp đặc biệt):
- Bạn cần định nghĩa hằng số một cách động, tức là giá trị của hằng số chỉ được xác định tại thời điểm chạy dựa trên một điều kiện, kết quả của một hàm, hoặc dữ liệu đầu vào. Đây là ưu điểm chính của
define()
. - Bạn cần định nghĩa một hằng số có phạm vi toàn cục mà bạn muốn truy cập từ bất kỳ đâu mà không cần quan tâm đến namespace hay lớp (mặc dù
const
cũng có thể là toàn cục nếu định nghĩa ở global scope). - Bạn cần tương thích với các phiên bản PHP cũ hơn (dưới PHP 5.3) nơi
const
không hỗ trợ mảng hoặc biểu thức hằng số.
Ví dụ nên dùng define()
:
<?php // Định nghĩa hằng số dựa trên môi trường chạy $env = "production"; if ($env === "development") { define('DEBUG_MODE', true); define('LOG_FILE', '/var/log/dev_app.log'); } else { define('DEBUG_MODE', false); define('LOG_FILE', '/var/log/prod_app.log'); } // Định nghĩa hằng số dựa trên kết quả của một hàm if (!defined('CURRENT_WORKING_DIR')) { // Kiểm tra để tránh định nghĩa lại define('CURRENT_WORKING_DIR', getcwd()); } echo "Chế độ Debug: " . (DEBUG_MODE ? "BẬT" : "TẮT") . "<br>"; echo "Tệp log: " . LOG_FILE . "<br>"; echo "Thư mục hiện tại: " . CURRENT_WORKING_DIR . "<br>"; ?>
Trong PHP hiện đại, const
là lựa chọn ưu tiên cho hầu hết các hằng số cố định nhờ cú pháp rõ ràng và khả năng tích hợp tốt với OOP. define()
vẫn giữ vai trò quan trọng khi bạn cần định nghĩa hằng số một cách động hoặc có các yêu cầu đặc biệt về giá trị hằng số.
Kết bài
Hằng số là một khái niệm cốt lõi trong lập trình PHP, mang lại sự ổn định và dễ quản lý cho các giá trị không đổi trong ứng dụng của bạn. Qua bài viết này, chúng ta đã cùng nhau làm rõ:
- Tầm quan trọng của hằng số: Không chỉ giúp duy trì tính nhất quán và dễ bảo trì code, mà còn cải thiện khả năng đọc hiểu và hiệu suất.
- Hai phương pháp tạo hằng số: Hàm
define()
và từ khóaconst
. - Sự khác biệt then chốt: Từ cú pháp, phạm vi truy cập (toàn cục với
define()
, cấp tệp/cấp lớp vớiconst
), đến khả năng định nghĩa động (chỉdefine()
hỗ trợ), và kiểu giá trị được phép. - Lời khuyên khi lựa chọn:
const
thường là lựa chọn ưu tiên cho hầu hết các hằng số tĩnh nhờ cú pháp gọn gàng và tích hợp tốt với OOP. Trong khi đó,define()
trở nên không thể thiếu khi bạn cần định nghĩa hằng số dựa trên các điều kiện động hoặc kết quả của hàm.
Việc nắm vững cách sử dụng và phân biệt giữa define()
và const
sẽ giúp bạn viết mã PHP hiệu quả hơn, có tổ chức hơn và dễ dàng bảo trì về lâu dài.