Namespaces

Namespaces là gì

Không thể tạo cùng tên file ở cùng một thư mục trong Windows (hay linux), nhưng có thể tạo hai file cùng tên ở hai thư mục khác nhau. PHP cũng có khái niệm namespaces, để giải quyết tình trạng đặt hai tên class trùng nhau.

Hay namespaces là cách để nhóm các class, interface, function, constant lại thành một nhóm.

Ví dụ chúng ta có thể tạo hai class cùng tên với nội dung khác nhau khi chúng ở các namespace khác nhau.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
namespace my\name;

class MyClass {}
$a = new MyClass;
$b = new \my\name\MyClass; // tương tự câu lệnh new MyClass
var_dump($a);

namespace my\name2;

class MyClass { public $a = 10;}
$c = new MyClass;
$d = new \my\name2\MyClass; // tương tự câu lệnh new MyClass
var_dump($c);

Cách viết namespace

Các namespace chỉ ảnh hưởng tới các loại sau: class (bao gồm class trừu tượng và trait), interface, hàm và hằng. Khi khai báo namespace, trước khi mở <?php thì không có khoảng cách hoặc dòng code nào khác. Giống như folder trong máy tính, tên namespace có thể đặt theo cấp cách nhau bởi dấu \.

Ở ví dụ sau sẽ bị lỗi, để loại bỏ lỗi này hãy xóa dòng đầu tiên có dòng code <html>.

1
2
3
4
<html>
<?php
namespace MyProject; // Lỗi, namespace phải nằm ở dòng đầu tiên
?>

Định nghĩa namespace ở cùng một file

Mặc dù không khuyến khích sử dụng tuy nhiên nhiều namespace cũng có thể ở trên cùng một file. Như ví dụ đầu tiên đã sử dụng, ngoài ra còn có thể sử dụng namespace với dấu {} như sau:

1
2
3
4
5
6
7
<?php
namespace MyProject {
  class MyClass {}
}
namespace AnotherProject {
  class MyClass {}
}

Khi không muốn sử dụng namespace nào (global code) thì chúng ta có thể sử dụng với tên namespace là rỗng như sau.

1
2
3
4
5
6
7
8
<?php
namespace MyProject {
  class MyClass {}
}

namespace { // global code
  $a = new \MyProject\MyClass();
}

Ngoài ra không có đoạn code nào ngoài đoạn code namespace {}.

1
2
3
4
5
<?php
namespace MyProject {
  class MyClass {}
}
var_dump(10); // Lỗi, vì không có namespace nào bao nó