什麼是命名空間呢?
命名空間(英語:Namespace)表示標識符(identifier)的可見范圍。一個標識符可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。這樣,在一個新的命名空間中可定義任何標識符,它們不會與任何已有的標識符發生沖突,因為已有的定義都處於其它命名空間中。
簡單說來命名空間是為了解決不同庫在同一個環境下使用時出現的命名沖突。例如我自己有一個函數名叫A,但是系統已經有一個A函數了,那就會出現沖突。
PHP從5.3版本開始引入了命名空間,之後許多現有PHP類庫以及框架都開始支持它。那麼PHP的命名空間怎麼用呢?
下面是一個定義命名空間的例子
<?php
//file a.php
namespace A;
const test = 'Atest';
function test() {
return __FUNCTION__;
}
class Test{
public function __construct(){
return __METHOD__;
}
}
?>
上面例子中就是一個典型的命名空間定義方法,只有const
, function
, class
受命名空間的約束。
使用命名空間的方式如下:
<?php
namespace B;
use A;
const test = 'Btest';
function test() {
return __FUNCTION__;
}
class Test{
public function __construct(){
return __METHOD__;
}
}
include "a.php";//必須包含A命名空間的文件
// 完全限定
// `\B\test`從絕對位置查找輸出,如果是全局函數則`\test`
echo \B\test; //輸出Btest
// 限定名稱
// 這裡已經通過`use A`申明了在這個文件可以通過`\A\...`使用A命名空間的函數
echo A\test; //輸出Atest
// 非限定名稱
// 非限定名稱的函數`test`會從當前命名控件查找,即B
echo test; //輸出Btest
// namespace關鍵字代表當前命名空間
echo namespace/test;
?>
首先要注意的是命名空間只起申明作用,也就是在使用了命名空間的時候依然得把這個命名空間申明的那個文件包含進來。在使用中可以通過__NAMESPACE__
來查看當前命名空間。
更多內容可以查看PHP官方文檔
每個文件既要申明命名控件又要手動include
是非常不智能的事情,所以在自己的PHP系統或者框架中可以使用自動加載技術,讓系統自己去找
最簡單的方式是利用函數__autoload
函數,但是這個函數只能在非命名控件下定義,也就是全局情況下:
function __autoload($class) {
$dir = './';
set_include_path(get_include_path().PATH_SEPARATOR.$ids_dir);
$class = str_replace('\\', '/', $class) . '.php';
require_once($class); }
如果在已經有了命名空間的類中,可以使用函數spl_autoload_register
來注冊一個類中的方法來代替__autoload