Menu
CoddyTech

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.

challenge icon

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ớp Car trong namespace Vehicle với thuộc tính public $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ức describe() trả về "Vehicle: [brand]".
  • Animal/Car.php: Định nghĩa một lớp Car trong namespace Animal (đây là một chú mèo tên Car!). Lớp này cần có thuộc tính public $age. Hàm khởi tạo nhận tuổi và gán giá trị đó. Thêm phương thức describe() trả về "Cat named Car, age: [age]".
  • main.php: Đưa cả hai tệp lớp vào bằng require_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ọi describe() 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\Car có hãng xe là "Toyota"
  • Một Animal\Car có 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

?>
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch PHP online