lib1.php < ?php // application library 1 namespace App\Lib1; const MYCONST = 'App\Lib1\MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { eturn __METHOD__; } } ?> lib2.php < ?php // application library 2 namespace App\Lib2; const MYCONST = 'App\Lib2\MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { eturn __METHOD__; } } ?>開始以前先要理解幾個PHP命名空間相關術語。
myapp1.php < ?php namespace App\Lib1; require_once('lib1.php'); require_once('lib2.php'); header('Content-type: text/plain'); echo MYCONST . "\n"; echo MyFunction() . "\n"; echo MyClass::WhoAmI() . "\n"; ?>即便咱們同時包括了lib1.php和lib2.php,MYCONST,MyFunction和MyClass標識符只能在lib1.php中引用,這是由於myapp1.php的代碼在相同的App\Lib1命名空間內。
App\Lib1\MYCONST App\Lib1\MyFunction App\Lib1\MyClass::WhoAmI
myapp2.php < ?php use App\Lib2; require_once('lib1.php'); require_once('lib2.php'); header('Content-type: text/plain'); echo Lib2\MYCONST . "\n"; echo Lib2\MyFunction() . "\n"; echo Lib2\MyClass::WhoAmI() . "\n"; ?>能夠定義任意數量的use語句,或使用逗號分隔成獨立的命名空間,在這個例子中咱們導入了App\Lib2命名空間,但咱們仍然不能直接引用MYCONST,MyFunction和MyClass,由於咱們的代碼還在全局空間中,但若是咱們添加了「Lib2\」前綴,它們就變成限定名稱了,PHP將會搜索導入的命名空間,直到找到匹配項。
App\Lib2\MYCONST App\Lib2\MyFunction App\Lib2\MyClass::WhoAmI
myapp3.php < ?php use App\Lib1 as L; use App\Lib2\MyClass as Obj; header('Content-type: text/plain'); require_once('lib1.php'); require_once('lib2.php'); echo L\MYCONST . "\n"; echo L\MyFunction() . "\n"; echo L\MyClass::WhoAmI() . "\n"; echo Obj::WhoAmI() . "\n"; ?>第一個use語句將App\Lib1定義爲「L」,任何使用「L」的限定名稱在編譯時都會被翻譯成「App\Lib1」,所以咱們就能夠引用L\MYCONST和L\MyFunction而不是徹底限定名稱了。
App\Lib1\MYCONST App\Lib1\MyFunction App\Lib1\MyClass::WhoAmI App\Lib2\MyClass::WhoAmI
< ?php namespace App\Lib1; echo __NAMESPACE__; // outputs: App\Lib1 ?>
這個值在調試時很是有用,它也可因爲動態生成一個徹底限定類名,如: php
< ?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } $c = __NAMESPACE__ . '\\MyClass'; $m = new $c; echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI ?>namespace關鍵字
< ?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } $m = new namespace\MyClass; echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI ?>自動載入命名空間類
< ?php $obj= new MyClass1(); // classes/MyClass1.php is auto-loaded $obj= new MyClass2(); // classes/MyClass2.php is auto-loaded // autoload function function __autoload($class_name) { require_once("classes/$class_name.php"); } ?>在PHP 5.3中,你能夠建立一個命名空間類的實例,在這種狀況下,徹底限定命名空間和類名傳遞給__autoload函數,例如,$class_name的值多是App\Lib1\MyClass。你能夠在相同的文件夾下放置全部的PHP類文件,從字符串中提取命名空間,但那樣會致使文件名衝突。
/classes/App/Lib1/MyClass.php < ?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } ?>在根文件夾下的文件就使用下面的代碼了:
myapp.php < ?php use App\Lib1\MyClass as MC; $obj = new MC(); echo $obj->WhoAmI(); // autoload function function __autoload($class) { // convert namespace to full file path $class = 'classes/' . str_replace('\\', '/', $class) . '.php'; require_once($class); } ?>解釋: