1. Namespace trong PHP là gì?

Sau này khi chúng ta làm với những dự án lớn, không chỉ làm một mình mà sẽ làm theo đội nhóm. Như vậy mỗi nhóm sẽ làm những phần khác nhau và sẽ tạo ra những class khác nhau. Chúng ta không thể đảm bảo rằng việc đặt tên các nhóm là sẽ không trùng nhau. Để giải quyết được vấn đề này thì Namespace hay gọi là không gian tên được ra đời.

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 và PHP nói riêng. Cụ thể là ở hướng đói tượng trong PHP thì namespace giúp tạo ra định danh cho lớp một cách cụ thể hóa hơn. Nó sẽ cho phép các lớp, hàm, hằng cùng tên được sử dụng trong các ngữ cảnh khác nhau mà không bị xung đột.

Ví dụ: ở một lớp mà có 3 đứa tên nam thì làm sao phân biệt được mà không cần phải nhìn mặt. Ở đây ta dùng họ tên hoặc một biệt danh nào đó là được. Và trong namespace cũng tương tự như vậy.

Namespace được tạo ra để giải quyết 2 vấn đề:

  • Vấn đề trùng tên giữa lớp, hàm, hằng và cho phép tổ chức tốt hơn bằng cách nhóm các lớp làm việc cùng nhau để thực hiện một nhiệm vụ.
  • Cho phép tạo các bí danh(hoặc tên viết ngắn lại) với các tên quá dài và cho phép sử dụng cùng một tên cho nhiều lớp.

2. Khai báo Namespace trong PHP hướng đối tượng

Cú pháp:

namespace Name;

Trong đó name là tên của namespace.

Một file chứa một namespace thì phải được khai báo đầu tiên trong tệp PHP, đặt trước các đoạn mã còn lại.

Ví dụ:

<?php
namespace tênNamespace;
class class1{
    //các phương thức và thuộc tính của lớp class1
}
function function1(){
    //Khai báo hàm
}
?>  

Nếu khai báo như sau sẽ không hợp lệ:

<?php
echo "Hello World!";
namespace Html;
...
?>

Chúng ta cũng có thể sử dụng nhiều namespace trong cùng một file

namespace vidu1;
//các lớp, hàm, hằng của namespace vidu1;
namespace vidu2;
//các lớp, hàm, hằng của namespace vidu2;

Ta cũng có thể đặt tên namespace theo thứ tự các cấp

namespace App\Controllers;

class HomeController{
    //code
}

3. Sử dụng Namespace trong PHP hướng đối tượng

Trước hết ta nên tạo namespace ở một file riêng để dễ quản lý và sử dụng. Sau đó ta sẽ include file chứa namespace bằng cú pháp:

include ("đường dẫn tới file vdnamespace.php");

3.1. Sử dụng trực tiếp thông qua tên Namespace

Bất kỳ mã nào theo sau một namespace khai báo đang hoạt động sau không gian tên vì vậy mà các lớp thuộc không gian tên có thể được khởi tạo mà không cần bất kỳ định dạng nào. Để truy cập các lớp từ bên ngoài một không gian tên, lớp đó cần phải có không gian tên gắn liền với nó.

Ví dụ:

include ("vdnamespace.php");
$b1=new vidu\hocSinh();
$b1->themHoSo("Nguyễn Trí Thành", "08/10/2002", "thanhntph15680@fpt.edu.vn");
echo ($b1->hoTen);

3.2. Nạp namespace bằng use

Nếu bạn không muốn sử dụng cách trên thì ta sử dụng từ khóa use theo cú pháp sau:

use tenNamespace\tenClass;

Dù khai báo theo cách nào thì namespace cũng được đặt trên đầu và nếu trong một file có sử dụng namespace và use thì use sẽ được đặt dưới namespace.

Ví dụ:

Tạo một file là vidu.php có nội dung sau:

<?php
namespace ConNguoi;
class ConNguoi
{
    private $name = 'Con Người';

    public function getName()
    {
        return $this->name;
    }
}

Sau đó là một file có khai báo namespace và use:

<?php
namespace nguoilon;
include 'ConNguoi.php';
use ConNguoi\ConNguoi;
class NguoiLon extends ConNguoi
{
    //code
}

3.3. Định danh cho namespace

Giả sử như namespace có một cái tên khá dài hoặc khó nhớ hoặc bạn muốn thay đổi nó thì ta sẽ tạo định danh cho namespace. Để tạo định danh ta sẽ dùng từ khóa as với cú pháp:

use tenNamespace as tenMoi;

Ví dụ: tạo định danh cho file trên

<?php
include 'ConNguoi.php';
use ConNguoi as People;
$connguoi = new People\ConNguoi();
echo $connguoi->getName();
//kết quả: Con Người

3.4. Nhiều namespace trong một file

Nếu có nhiều namespace trong một file ta sẽ khai báo theo mẫu sau:

namespace nameone;
class ClassOne
{
    //
}
namespace nametwo;
class ClassTwo
{
    //
}

4. Cách sử dụng namespace hiệu quả

Bạn sẽ cần phải ngăn ngừa xung đột tên thư mục. Vì vậy, tốt hơn là thêm tất cả các lớp vào một Namespace. (Nên đặt theo tên thư mục).

Nhóm các lớp tương tự vào một Namespace con.

Sử dụng cấu trúc thư mục một cách chính xác.