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ó