Giới thiệu về không gian tên
Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 10 trên 91.
Khi các dự án PHP của bạn phát triển, bạn sẽ tạo nhiều lớp. Điều gì xảy ra khi hai lớp có cùng tên?
Ví dụ, bạn có thể có một lớp User cho blog và một lớp User khác cho cửa hàng. Namespace giải quyết vấn đề này bằng cách sắp xếp các lớp thành những nhóm hợp lý.
Namespace giống như một thư mục chứa các lớp của bạn. Bạn khai báo namespace ở đầu tệp PHP bằng từ khóa namespace:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Giờ bạn có thể có một lớp User khác trong một không gian tên khác:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
Để dùng một lớp có không gian tên, bạn tham chiếu đến lớp đó bằng đường dẫn đầy đủ, sử dụng dấu gạch chéo ngược:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
Đầu ra:
Alice
alice@example.com
Dấu gạch chéo ngược \ phân tách các cấp không gian tên, tương tự như cách dấu gạch chéo phân tách các thư mục trong đường dẫn tệp. Bạn cũng có thể tạo các không gian tên lồng nhau như App\Models\Blog để tổ chức sâu hơn.
Điểm chính: Namespace giúp tránh xung đột tên và giữ code ngăn nắp. Luôn khai báo namespace trước mọi code khác trong tệp, ngoại trừ các câu lệnh declare.
Thử thách
DễHãy sắp xếp một ứng dụng nhỏ bằng namespace để tránh xung đột tên giữa các lớp có cùng tên.
Hãy tưởng tượng bạn đang xây dựng một hệ thống quản lý cả phương tiện lẫn động vật. Cả hai lĩnh vực đều có một thực thể tên là Car: một thực thể đại diện cho một chiếc ô tô thật, còn thực thể kia là một chú mèo cưng tên "Car" (đúng vậy, có người đặt tên mèo như thế!).
Bạn sẽ tạo ba tệp:
Vehicle/Car.php: Định nghĩa một lớpCartrong namespaceVehiclevới thuộc tínhpublic $brand. Hàm khởi tạo sẽ nhận tên hãng xe và gán giá trị đó. Thêm phương thứcdescribe()trả về"Vehicle: [brand]".Animal/Car.php: Định nghĩa một lớpCartrong namespaceAnimal(đây là một chú mèo tên Car!). Lớp này cần có thuộc tínhpublic $age. Hàm khởi tạo nhận tuổi và gán giá trị đó. Thêm phương thứcdescribe()trả về"Cat named Car, age: [age]".main.php: Đưa cả hai tệp lớp vào bằngrequire_once. Tạo một đối tượng từ mỗi namespace bằng đường dẫn namespace đầy đủ, sau đó in kết quả gọidescribe()trên mỗi đối tượng, mỗi kết quả trên một dòng riêng.
Trong main.php, hãy tạo:
- Một
Vehicle\Carcó hãng xe là"Toyota" - Một
Animal\Carcó tuổi là3
Nhớ dùng dấu gạch chéo ngược \ để tham chiếu đến các lớp có namespace bằng đường dẫn đầy đủ khi tạo đối tượng.
Tự làm thử
<?php
// Thêm các tệp lớp (class)
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: Tạo đối tượng (object) Vehicle\Car có thương hiệu "Toyota"
// Nhớ dùng đường dẫn không gian tên đầy đủ với dấu gạch chéo ngược
// TODO: Tạo đối tượng Animal\Car có tuổi là 3
// Nhớ dùng đường dẫn không gian tên đầy đủ với dấu gạch chéo ngược
// TODO: In ra kết quả của describe() cho từng đối tượng, mỗi kết quả trên một dòng riêng
?>Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa $thisPhương thứcThuộc tínhHàm khởi tạo (__construct)Hàm hủy (__destruct)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnTừ khóa parent::Ghi đè phương thứcTừ khóa finalLớp trừu tượngÔn tập: hệ thống phân cấp nhân viên7Đóng gói
Công khai, được bảo vệ, riêng tưTìm hiểu sâu về bộ điều chỉnh quyền truy cậpGetter và setterẨn thông tinRút gọn hàm khởi tạo (8.0)Ôn tập: hệ thống hồ sơ học sinh2Không gian tên và tự động nạp
Giới thiệu về không gian tênTừ khóa useChuẩn tự động nạp PSR-4Trình tự động nạp của ComposerÔn tập: dự án có tổ chức5Giao diện và hợp đồng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnGiao diện và lớp trừu tượngGợi ý kiểu với giao diệnÔn tập: Máy tính hình học8Phương thức ma thuật
Giới thiệu về phương thức ma thuật__toString và __debugInfo__get, __set, __isset, __unset__call và __callStatic__clone và sao chép đối tượng__serialize và __unserializeÔn tập: Bộ sưu tập tùy chỉnh3Thuộc tính của lớp
Thuộc tính instance và staticHằng số trong lớpPhương thức và thuộc tính staticThuộc tính private và protectedThuộc tính chỉ đọc (PHP 8.1)Ôn tập: Trình quản lý tài khoản ngân hàng6Đa hình
Xem lại việc ghi đè phương thứcĐa hình qua giao diệnGợi ý kiểu và kiểu hợpLiên kết tĩnh muộnÔn tập: bộ xử lý thanh toánTự luyện tập: Trình biên dịch PHP online