[Bài đọc] Namespace
Sử dụng namespace
Cũng giống như trường hợp của các file và thư mục, việc truy cập đến một file hoặc thư mục được thực hiện theo 2 cách: tương đối (relative) hoặc tuyệt đối (absolute).
- Truy cập theo đường dẫn tương đối có nghĩa là căn cứ vào vị trí hiện tại (current location). Chẳng hạn, nếu chúng ta đang ở trong thư mục currentdirectory và chúng ta muốn truy cập vào file foo.txt thì có nghĩa là đường dẫn của file là currentdirectory/foo.txt. Còn nếu chúng ta đang ở trong thư mục /home/foo và muốn truy cập vào file foo.txt thì có nghĩa là đường dẫn của nó là /home/foo/foo.txt
- Truy cập theo đường dẫn tuyệt đối có nghĩa là căn cứ vào thư mục gốc (/) của hệ thống, mà không phụ thuộc vào vị trí hiện tại. Chẳng hạn, đường dẫn /main/foo.txt thì luôn luôn chỉ đến file /main/foo.txt.
Đối với namespace, cách hoạt động cũng tương tự:
- Không chỉ định tên (unqualified name), có nghĩa là chỉ sử dụng tên lớp/hàm/hằng mà không cần chỉ định tên của namespace. Chúng ta có thể làm việc này nếu đang thao tác trong cùng namespace với đối tượng đang được sử dụng. Chẳng hạn, nếu chúng ta có lớp Foo nằm trong namespace foo và chúng ta đang thao tác ở trong namespace này thì có thể sử dụng trực tiếp tên của lớp như $a = new Foo();.
- Chỉ định tên của namespace, có nghĩa là ghi rõ tên của namespace trước tên của lớp/hàm/hằng. Chẳng hạn, nếu lớp Foo ở trong namespace foo thì chúng ta có thể truy cập đến lớp Foo như sau $a = new \foo\Foo();.
Ví dụ:
file1.php
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* Unqualified name */
foo(); // resolves to function Foo\Bar\foo
foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* Qualified name */
subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo,
// method staticmethod
echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO
/* Fully qualified name */
\Foo\Bar\foo(); // resolves to function Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO
?>
Leave a Reply