Trong lập trình hướng đối tượng (OOP) trong PHP, ngoài các thuộc tính và phương thức, bạn còn có thể định nghĩa các hằng số cho class. Hằng số (constant) là các giá trị không thể thay đổi trong suốt thời gian tồn tại của chương trình. Chúng thường được sử dụng để đại diện cho các giá trị cố định mà bạn không muốn thay đổi, chẳng hạn như cài đặt cấu hình, thông số cố định, hoặc các giá trị thường xuyên sử dụng.
Trong bài viết này, chúng ta sẽ tìm hiểu về cách định nghĩa và sử dụng hằng số trong class PHP (Class Constants).
1. Hằng số là gì?
Hằng số là một biến có giá trị cố định và không thay đổi trong suốt quá trình chạy của chương trình. Trong PHP OOP, bạn có thể định nghĩa hằng số bên trong các class. Các hằng số này có thể được truy cập mà không cần tạo ra một đối tượng của class, thông qua cú pháp ClassName::CONSTANT_NAME.
Hằng số class được khai báo bằng từ khóa const, và giá trị của chúng phải được gán ngay khi khai báo, không thể thay đổi sau đó.
Cú pháp khai báo hằng số trong class
class ClassName {
const CONSTANT_NAME = value;
}const: Từ khóa dùng để khai báo hằng số.CONSTANT_NAME: Tên hằng số, theo quy tắc đặt tên phải viết hoa.value: Giá trị của hằng số, có thể là chuỗi, số, hoặc bất kỳ giá trị cơ bản nào.
2. Ví dụ về hằng số trong class
Dưới đây là một ví dụ về cách định nghĩa và sử dụng hằng số trong một class PHP:
class Car {
const WHEELS = 4; // Hằng số chỉ số lượng bánh xe
const BRAND = "Toyota"; // Hằng số chỉ hãng xe
public function getBrand() {
return self::BRAND; // Truy cập hằng số bên trong class
}
}
// Truy cập hằng số từ bên ngoài class
echo Car::WHEELS; // Output: 4
echo Car::BRAND; // Output: Toyota
// Truy cập hằng số thông qua phương thức
$myCar = new Car();
echo $myCar->getBrand(); // Output: ToyotaGiải thích:
- Hằng số
WHEELSvàBRANDđược khai báo trong classCar. - Hằng số được truy cập từ bên ngoài class thông qua cú pháp
ClassName::CONSTANT_NAME, ví dụCar::WHEELS. - Khi truy cập hằng số từ bên trong class, ta sử dụng từ khóa
self::thay vì$this->. Điều này là do hằng số không thuộc về một đối tượng cụ thể mà thuộc về chính class.
3. Từ khóa self và parent khi truy cập hằng số
self::CONSTANT_NAME: Được sử dụng để truy cập hằng số từ bên trong class mà hằng số đó được khai báo.parent::CONSTANT_NAME: Được sử dụng để truy cập hằng số từ class cha trong trường hợp kế thừa.
Ví dụ sử dụng parent:::
class Vehicle {
const TYPE = "Vehicle";
}
class Car extends Vehicle {
const TYPE = "Car";
public function getParentType() {
return parent::TYPE; // Truy cập hằng số từ class cha
}
public function getType() {
return self::TYPE; // Truy cập hằng số từ class con
}
}
$myCar = new Car();
echo $myCar->getParentType(); // Output: Vehicle
echo $myCar->getType(); // Output: CarGiải thích:
- Class
Vehiclecó hằng sốTYPEđược định nghĩa là"Vehicle". - Class
Carkế thừa từ classVehiclevà ghi đè hằng sốTYPEvới giá trị"Car". - Bên trong class
Car, phương thứcgetParentType()sử dụngparent::TYPEđể truy cập hằng số từ class chaVehicle. - Phương thức
getType()sử dụngself::TYPEđể truy cập hằng số của chính classCar.
4. Hằng số trong kế thừa
Trong kế thừa, hằng số từ class cha có thể được sử dụng trực tiếp bởi class con. Tuy nhiên, class con cũng có thể ghi đè hằng số của class cha bằng cách định nghĩa lại hằng số với cùng tên.
Ví dụ kế thừa hằng số:
class Animal {
const CATEGORY = "Mammal";
}
class Dog extends Animal {
const CATEGORY = "Canine";
}
echo Animal::CATEGORY; // Output: Mammal
echo Dog::CATEGORY; // Output: CanineGiải thích:
- Class
Animalđịnh nghĩa hằng sốCATEGORYlà"Mammal". - Class
Dogkế thừa từAnimal, nhưng nó ghi đè hằng sốCATEGORYvới giá trị"Canine". - Khi truy cập hằng số từ class cha (
Animal::CATEGORY), kết quả là"Mammal". Khi truy cập từ class con (Dog::CATEGORY), kết quả là"Canine".
5. Các quy tắc về hằng số class
- Hằng số phải có giá trị cố định: Giá trị của hằng số phải được gán ngay khi khai báo và không thể thay đổi sau đó.
- Không thể truy cập bằng đối tượng: Bạn không thể truy cập hằng số bằng cú pháp
$this->CONSTANT_NAME. Thay vào đó, bạn phải sử dụng cú phápself::CONSTANT_NAMEhoặcClassName::CONSTANT_NAME. - Tên hằng số thường viết hoa: Tên hằng số nên được viết hoa để phân biệt dễ dàng với các thuộc tính khác trong class. Đây là quy ước phổ biến, nhưng không phải là bắt buộc.
- Không hỗ trợ kế thừa động: Bạn không thể thay đổi giá trị của hằng số trong các class con một cách động, hằng số là cố định một khi được khai báo.
6. Sự khác nhau giữa thuộc tính tĩnh và hằng số class
Cả hằng số class và thuộc tính tĩnh đều có thể được truy cập mà không cần tạo đối tượng, nhưng có sự khác biệt cơ bản giữa chúng:
| Hằng số (Constants) | Thuộc tính tĩnh (Static Properties) |
|---|---|
| Giá trị không thể thay đổi sau khi được gán. | Giá trị có thể thay đổi trong quá trình thực thi chương trình. |
Được khai báo bằng const. | Được khai báo bằng từ khóa static. |
| Không thể kế thừa động (không thể ghi đè giá trị theo thời gian thực). | Có thể ghi đè giá trị trong class con. |
Không thể tham chiếu bằng $this. | Có thể tham chiếu bằng $this hoặc self. |
Ví dụ so sánh:
class Example {
const CONSTANT_VALUE = 10;
public static $staticValue = 20;
}
echo Example::CONSTANT_VALUE; // Output: 10
echo Example::$staticValue; // Output: 20
// Thay đổi thuộc tính tĩnh
Example::$staticValue = 30;
echo Example::$staticValue; // Output: 30
// Thay đổi hằng số sẽ gây lỗi
// Example::CONSTANT_VALUE = 15; // Lỗi: không thể thay đổi giá trị của hằng số7. Khi nào nên sử dụng hằng số class?
Hằng số class rất hữu ích trong các tình huống mà giá trị không bao giờ thay đổi trong suốt thời gian chạy của chương trình, chẳng hạn như:
- Cấu hình: Các thông số cấu hình chung của ứng dụng như phiên bản, tên ứng dụng.
- Giá trị mặc định: Các giá trị mặc định hoặc giới hạn như số lượng tối đa, loại mặc định, trạng thái.
- Biểu diễn trạng thái: Các trạng thái cố định của một đối tượng, chẳng hạn như trạng thái đặt hàng (đã đặt, đang xử lý, đã giao).
Kết luận
Hằng số trong PHP OOP là một cách tuyệt vời để lưu trữ các giá trị cố định mà bạn không muốn thay đổi trong suốt quá trình chạy của chương trình. Chúng giúp mã của bạn trở nên dễ đọc, dễ bảo trì và bảo vệ các giá trị quan trọng không bị thay đổi ngoài ý muốn.
Sử dụng hằng số trong các class giúp đảm bảo rằng những giá trị quan trọng sẽ luôn giữ nguyên, đồng thời cung cấp một cách dễ dàng để truy cập chúng từ cả bên trong và bên ngoài class. Trong bài học tiếp theo, chúng ta sẽ tiếp tục khám phá các khái niệm khác trong PHP OOP như interface và abstract class.








