1. Hằng trong PHP là gì?

Hằng nghe như là một khái niệm gì mới nhưng thực chất ra nó chính là biến mà ta đã tìm hiểu ở bài trước.Tuy nhiên Hằng và Biến có những sự khác nhau nhất định mà ta mới phải học trong 2 bài khác nhau.

Hằng là một định danh cho một giá trị đơn giản. Giống như Hằng mà ta đã học ở toán, Hằng trong PHP cũng không thể thay đổi giá trị của nó(trong khi Biến thì có thể thay đổi). Giá trị tương ứng với tên Hằng sau khi ta định nghĩa sẽ không thay đổi trong quá trình chúng ta thi hành script.

2. So sánh giữa Hằng và Biến trong PHP

Bản chất thì Hằng chính là Biến nhưng không thể thay đổi giá trị. Tuy nhiên Hằng và Biến có những sự khác nhau khác và đặc biệt là Hằng mà ta cần lưu ý.

  • Đầu tiên sự khác biệt ta có thể thấy rõ nhất là Hằng sẽ không cần ký tự dollar($) như ở Biến.
  • Hằng có thể truy cập ở bất cứ đâu mà sẽ không bị giới hạn truy cập như là Biến(phạm vi toàn cục GLOBAL).
  • Biến sẽ được gán giá trị bởi dấu ( = ) còn với Hằng ta phải khai báo được thì ta cần sử dụng hàm define()
  • Ngay sau khi giá trị của Hằng thiết lập ta không định nghĩa lại nếu không ta sẽ gặp lỗi phát sinh.

3. Cách khai báo một Hằng trong PHP

Hằng số có cách khai báo khác hẳn với Biến. Chúng ta sẽ sử dụng hàm define() để có thể khai báo ra một Hằng.

Trước khi khai báo ra một Hằng thì mình có một số lưu ý nhỏ cho các bạn nhé:

  • Hằng cũng sẽ phân biệt chữ hoa chữ thường.
  • Thông thường khi code ta nên đặt tên Hằng bằng chữ in hoa để có thể phân biệt rõ ràng hơn và khi code chúng ta sẽ dễ nhìn hơn(cái này là không bắt buộc nhé!).
  • Hằng phải bắt đầu bằng một ký tự chữ cái hoặc dấu gạch dưới( _ ), và theo sau không được có các ký tự đặc biệt.

Để khai báo ra được một Hằng ta sử dụng hàm define() và ta sẽ có câu lệnh sau

define(name, value, case-insensitive);. Mình sẽ phân biệt các thông số qua bảng sau:

Tham số Ý Nghĩa Ví dụ
Name(bắt buộc) Tên hằng “LAPTRINHTUDAU”
Value(bắt buộc) Giá trị của hằng “Chào mừng bạn đến với khóa hoc online của mình!”
Case-insensitive
(không bắt buộc)
Phân biệt chữ in hoa in thường

Tham số này có thể nhận một trong 2 giá trị:

True: không phân biệt.

False: có phân biệt – sẽ được đặt là giá trị mặc định.

Trong một số trường hợp mà bạn muốn dùng biến lưu trữ tên Hằng thì lấy giá trị của Hằng bằng hàm constant().

Ví dụ:

<?php
/* Tạo một hằng số có tên là laptrinhtudau và gán giá trị cho nó là: học lập trình từ con số 0*/
define('laptrinhtudau', 'học lập trình từ con số 0');
echo laptrinhtudau; // xuất ra màn hình giá trị của hằng.
?>

Khi bạn định nghĩa một Hằng rồi mà sau đó lại định nghĩa tiếp Hằng đó rồi thì câu hỏi là làm sao để ta có thể biết Hằng đó đã được định nghĩa hay chưa? Và trong PHP ta sẽ sử dụng hàm defined().

4. Các hàm đã được định nghĩa sẵn trong PHP – Built in Constants

Khi ta hoạt động PHP thì sẽ có hàng ngàn Hằng số và sau nhiều cải tiến mà nâng cấp, PHP đã hỗ trợ người lập trình bằng cách cung cấp sẵn các Hằng như: các hằng môi trường, các hằng của Web server Apache,… Và PHP cũng giúp người lập trình xem các giá trị này bằng hàm phpinfo(). Các bạn cũng có thể tham khảo thêm tại https://www.php.net/manual/en/reserved.constants.php

5. Một số hàm đặc biệt và hay dùng trong PHP (Magic Constant)

PHP cung cấp sẵn cho ta một số lượng lớn Hằng đã được định nghĩa sẵn. Nhưng ta đôi khi cũng không nhớ và sử dụng được hết tất cả. Nhưng có những Hằng đặc biệt và ta sẽ sử dụng liên tục trong quá trình học tập và làm việc. Mình sẽ cung cấp cho các bạn một số Hằng mà chúng ta sẽ hãy sử dụng và nó rất là Magic nhé (ảo thuật đấy). Hãy cố học và nhớ lấy các Hằng này nhé!

Tên Hằng Ý Nghĩa
_LINE_ Dòng hiện tại của PHP file.
__FILE__ Tên file đầy đủ của script đang thi hành .
__DIR__ Tên thư mục đầy đủ của file PHP.
__FUNCTION__ Lấy tên của hàm đang chạy.
_CLASS_ Tên của lớp đang chạy.
_TRAIT_ Tên của trait đang chạy.
__METHOD__ Lấy tên method của lớp.
__NAMESPACE__ Lấy tên namespace.
Classname: : class Tên đầy đủ của một lớp.

Ví dụ: mình sẽ chỉ đưa ra một ví dụ nhỏ các bạn có thể tự tìm hiểu thêm hoặc chúng ta sẽ tìm hiểu dần trong những bài học tiếp

<?php
namespace UserModel {
    class User {
        public function __construct() {
            echo 'I am in '.__CLASS__.'</br>';
        }
        public function showData() {
            echo 'I am in '.__METHOD__.'</br>';
        }
    }
   
    $obj = new User;
    $obj->showData();
    echo __NAMESPACE__;
}
?>