thepcafe

Sự khác nhau giữa define() và const

Từ bản PHP 5.3, có thể dùng hai cách để định nghĩa một biến hằng số: Có thể dùng const hoặc define():

const FOO = 'BAR';
define('FOO', 'BAR');

Sự khác nhau cơ bản giữa 2 cách này là const định nghĩa hằng số lúc biên dịch, còn define định nghĩa lúc chạy(run time). Đây cũng chính là nguyên nhân dẫn đến một vài bất tiện của const:

  • const không thể định nghĩa biến hằng số trong điều kiện. Để định nghĩa hằng số thì phải định nghĩa ở phạm vi ngoài cùng:
if (...) {
    const FOO = 'BAR';    // không hợp lệ
}
// nhưng
if (...) {
    define('FOO', 'BAR'); // hợp lệ
}
  • Nhưng tại sao lại phải làm thế? Sao lại phải định nghĩa hằng số trong một điều kiện. Một ví dụ định nghĩa hằng số và kiểm tra nó đã được định nghĩa chưa:
if (!defined('FOO')) {
    define('FOO', 'BAR');
}
  • const chấp nhận một giá trị tĩnh vô hướng (static scalar) như là (number, string hoặc các hằng số như là true, false, null, __FILE__), trong khi đó define() có thể nhận giá trị từ bất kỳ biểu thức nào. Từ bản PHP 5.6 cho phép gán giá trị từ biểu thức vào const:
const BIT_5 = 1 << 5;    // hợp lệ từ bản PHP 5.6, không hợp lệ cho các bản cũ hơn
define('BIT_5', 1 << 5); // luôn hợp lệ
  • const phải được đặt tên từ một từ cố định, trong khi define() có thể đặt tên theo giá trị trả về của một biểu thức. Điều này cho phép đặt tên theo kiểu sau đây:
for ($i = 0; $i < 32; ++$i) {
    define('BIT_' . $i, 1 << $i);
}
  • const không phân biệt chữ hoa với chữ thường, trong khi define() cho phép định nghĩa hằng số không phân biệt chữ hoa chữ thường bằng cách truyền giá trị true vào tham số thứ ba:
define('FOO', 'BAR', true);
echo FOO; // BAR
echo foo; // BAR

Ok, đó là mấy điểm bất lợi của const. Nhưng... bạn nên nghĩ trong đầu rằng luôn luôn nên dùng const trừ khi một trong những trường hợp bên trên xảy ra:

  • const đơn giả dễ nhìn hơn. Nó là cấu trúc của ngôn ngữ chứ không phải phương thức và luôn phù hợp cho việc định nghĩa các hằng số bên trong Class.
  • const, vì nó là thành phần cấu trúc của ngôn ngữ nên có thể phân tích chương trình tĩnh bằng các công cụ tự động.
  • const định nghĩa hằng sô trong namespace được khai báo, trong khi define() phải truyền vào đường dẫn đầy đủ của namespace:
namespace A\B\C;
// Định nghĩa hằng số A\B\C\FOO:
const FOO = 'BAR'; //Cái này nó mặc định lấy luôn namespace A\B\C
define('A\B\C\FOO', 'BAR'); //Cái này phải khai báo đầy đủ tên tuổi địa chỉ
  • Từ bản PHP 5.6 const có thể là một mảng, còn define() có thể chứa giá trị là một mảng từ bản PHP 7.0.
const FOO = [1, 2, 3];    // hợp lệ trong bản PHP 5.6
define('FOO', [1, 2, 3]); // không hợp lệ trong bản PHP 5.6, nhưng hợp lệ trong bản PHP 7.0

Cuối cùng, const có thể dùng trong Class hoặc Interface để định nghĩa hằng của Class hoặc hằng số của Interface. define thì không thể định nghĩa như thế được:

class Foo {
    const BAR = 2; // hợp lệ
}
// nhưng
class Baz {
    define('QUX', 2); // không hợp lệ
}

Tổng kết

Trừ khi bạn cần định nghĩa hằng số theo điều kiện hoặc một biểu thức thì dùng define() còn không thì nên dùng const cho dễ đọc code.

Tags

Có thể bạn quan tâm

Giới thiệu toán tử Double not (!!) trong PHP

Xin giới thiệu với anh em một toán tử rất lạ là !! (Double not). Phủ định của phủ định là khẳng định, vậy tại sao không dùng phủ định hoặc khẳng đị...