Trong quá trình triển khai dự án lớn, đã bao giờ bạn nghĩ đến việc có thể xảy ra trường hợp hai class trùng tên nhau? Để khắc phục điều này, phiên bản PHP từ 5.3 trở đi đã hỗ trợ chúng ta với chức năng mới gọi là “namespace”…
1. Namespace là gì?
- Namespace giúp tạo ra một không gian tên cho hàm và lớp trong lập trình nói chung, đặc biệt là trong PHP.
- Trong bài viết này, chúng ta sẽ tập trung vào việc sử dụng namespace trong hướng đối tượng, nơi namespace giúp xác định định danh cho lớp một cách cụ thể hơn.
Ví dụ: Giả sử chúng ta có 2 tệp tin, mỗi tệp tin chứa một class và cả hai class này đều có cùng tên. Khi bạn nhúng cả hai tệp tin này và gọi class, chương trình sẽ hiển thị lỗi. Để khắc phục tình huống này, chúng ta cần sử dụng “namespace” cho hai class đó (hãy tiếp tục đọc để biết cách khai báo).
2. Cách khai báo namespace
- Để khai báo “namespace” trong PHP, chúng ta sử dụng cú pháp sau:
namespace TênNamespace;
- Ở đây, “TênNamespace” là tên của namespace.
Chú ý: Khi khai báo “namespace”, chúng ta cần đặt nó ở phía đầu tệp tin. Ngoài ra, để đặt tên “namespace” theo chuẩn, bạn có thể tham khảo chuỗi tiêu chuẩn PHP.
Ví dụ:
class Gói {
public function sayHello() {
echo 'Xin chào!';
}
}
- Bạn cũng có thể đặt tên namespace theo nhiều cấp độ khác nhau.
Ví dụ: Tạo một class “HomeController” trong thư mục “app/controllers” và đặt tên “namespace” như sau:
namespace AppControllers;
class HomeController {
// code
}
3. Gọi namespace
- Khi một class đã được định danh bởi namespace, bạn sẽ không thể gọi nó theo cách thông thường nữa. Thay vào đó, bạn phải sử dụng cú pháp sau:
new TênNamespaceTênClass();
Ví dụ:
- Tạo một tệp tin “ConNguoi.php” với nội dung như sau:
<?php
namespace ConNguoi;
class ConNguoi {
private $name = 'Con Người';
public function getName() {
return $this->name;
}
}
- Sau đó, tạo một tệp tin “index.php” cùng cấp với tệp tin “ConNguoi.php”. Bây giờ, chúng ta sẽ phải gọi class “ConNguoi” như sau:
<?php
include 'ConNguoi.php';
$connguoi = new ConNguoiConNguoi();
echo $connguoi->getName(); // kết quả: Con Người
Nạp namespace bằng “use”
- Nếu bạn không muốn gọi namespace theo cách trên, bạn có thể sử dụng từ khóa “use” để nạp theo cú pháp sau:
use TênNamespaceTênClass;
Chú ý: Khai báo nạp namespace cũng phải được đặt ở đầu tệp tin. Trong một tệp tin có sử dụng cả namespace và “use”, phần “use” sẽ được đặt dưới phần “namespace”.
Ví dụ: Sử dụng “use” để nạp namespace của class “ConNguoi”. Khi đó, tệp tin “index.php” sẽ được viết như sau:
<?php
include 'ConNguoi.php';
use ConNguoiConNguoi;
$connguoi = new ConNguoi();
echo $connguoi->getName(); // kết quả: Con Người
- Nếu một tệp tin có cả khai báo namespace và “use”, bạn có thể viết như sau:
<?php
namespace NguoiLon;
include 'ConNguoi.php';
use ConNguoiConNguoi;
class NguoiLon extends ConNguoi {
// code
}
4. Định danh cho namespace
-
Giả sử namespace của chúng ta rất dài hoặc vì một lý do nào đó bạn không muốn gọi namespace theo tên gốc, thì PHP cung cấp phương pháp “tạo định danh cho namespace”.
-
Để tạo định danh mới cho namespace trong PHP, chúng ta sử dụng từ khóa “as” với cú pháp như sau:
use TênNamespace as TênMới;
Ví dụ: Tạo định danh cho namespace “ConNguoi”:
<?php
include 'ConNguoi.php';
use ConNguoi as People;
$connguoi = new PeopleConNguoi();
echo $connguoi->getName(); // kết quả: Con Người
5. Nhiều namespace trong một tệp tin
- Trong trường hợp một tệp tin có nhiều namespace, chúng ta sẽ khai báo như sau:
namespace TênNamespace1;
class LớpMột {
// code
}
namespace TênNamespace2;
class LớpHai {
// code
}
Ví dụ:
- Tạo một tệp tin “Class.php” với nội dung như sau:
<?php
namespace ClassConNguoi;
class ConNguoi {
private $name = 'Con Người';
public function getName() {
return $this->name;
}
}
namespace ClassNguoiLon;
class NguoiLon {
private $name = 'Người Lớn';
public function getName() {
return $this->name;
}
}
- Tiếp theo, chúng ta sẽ tạo một tệp tin “index.php” để gọi 2 class đó như sau:
<?php
include 'Class.php';
$connguoi = new ClassConNguoiConNguoi();
echo $connguoi->getName(); // kết quả: Con Người
$nguoilon = new ClassNguoiLonNguoiLon();
echo $nguoilon->getName(); // kết quả: Người Lớn
6. Lời kết
- Như vậy, chúng ta đã tìm hiểu về “namespace trong PHP” và hy vọng rằng các bạn đã nắm chắc kiến thức này để khi học các framework PHP như Laravel, Zend,… sẽ không cảm thấy bỡ ngỡ. Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về “Trait trong PHP”.
Được chỉnh sửa bởi: Dnulib