PHP 命名空間(namespace)是在 PHP 5.3 中加入的弧械,目的是解決重名問題空民,PHP中不允許兩個函數(shù)或者類出現(xiàn)相同的名字,否則會產(chǎn)生一個致命的錯誤画饥。
定義命名空間
默認情況下浊猾,所有常量、類和函數(shù)名都放在全局空間下葫慎,就和PHP支持命名空間之前一樣偷办。
命名空間通過關(guān)鍵字namespace 來聲明艰额。如果一個文件中包含命名空間椒涯,它必須在其它所有代碼之前聲明命名空間。
語法格式如下:
<?php
// 定義代碼在 'MyProject' 命名空間中
namespace MyProject;
// ... 代碼 ...
你也可以在同一個文件中定義不同的命名空間代碼祖搓,如:
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
不建議使用這種語法在單個文件中定義多個命名空間湖苞。建議使用下面的大括號形式的語法。
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
命名空間調(diào)用
PHP 命名空間中的類名可以通過三種方式引用:
1哈扮、非限定名稱蚓再,或不包含前綴的類名稱,例如 $a=new foo()或 foo::staticmethod()摘仅。如果當前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo六荒。如果使用 foo 的代碼是全局的矾端,不包含在任何命名空間中的代碼,則 foo 會被解析為foo秩铆。 警告:如果命名空間中的函數(shù)或常量未定義,則該非限定的函數(shù)名稱或常量名稱會被解析為全局函數(shù)名稱或常量名稱捅膘。
2滚粟、限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();凡壤。如果當前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo曹体。如果使用 foo 的代碼是全局的盖奈,不包含在任何命名空間中的代碼,foo 會被解析為subnamespace\foo钢坦。
3、完全限定名稱厨诸,或包含了全局前綴操作符的名稱禾酱,例如绘趋, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();颗管。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\foo垦江。
下面是一個使用這三種方式的實例:
file1.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() {}
}
/* 非限定名稱 */
foo(); // 解析為函數(shù) Foo\Bar\foo
foo::staticmethod(); // 解析為類 Foo\Bar\foo ,方法為 staticmethod
echo FOO; // 解析為常量 Foo\Bar\FOO
/* 限定名稱 */
subnamespace\foo(); // 解析為函數(shù) Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析為類 Foo\Bar\subnamespace\foo,
// 以及類的方法 staticmethod
echo subnamespace\FOO; // 解析為常量 Foo\Bar\subnamespace\FOO
/* 完全限定名稱 */
\Foo\Bar\foo(); // 解析為函數(shù) Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析為類 Foo\Bar\foo, 以及類的方法 staticmethod
echo \Foo\Bar\FOO; // 解析為常量 Foo\Bar\FOO
?>