參考資料:
PHP手冊-語言參考:
http://php.net/manual/zh/language.namespaces.php
概要:
1. 聲明了命名空間之后,下面的const, function, class都會划歸到該命名空間。
2. 只有聲明過命名空間的PHP 文件才能加載有命名空間的PHP文件。
3. PHP 5.3 及以上才能使用命名空間
名詞:
關鍵字:namespace 用來聲明 本PHP文件的命名空間
常量:__NAMESPACE__ 用來返回當前命名空間的名稱 默認為空字符串
操作符: use 默認以最后一個\后的字符串為別名,配合 as 則為 as后的字符串,與MySQL的字段別名一致。
實際操作如下:
在apache目錄下建立如下文件:index.php,Order.php,User.php

Order.php 的內容為
1 <?php 2 /** 3 * @Author: Martin 4 * @Support: Martin 5 * @Last Modified by: Martin 6 */ 7 namespace Order; 8 9 const STR = 'order list<br />'; 10 11 function detail() 12 { 13 return 'order detail<br />'; 14 } 15 function call_by_self() 16 { 17 return 'call by self<br />'; 18 } 19 /** 20 * 21 */ 22 class Orderlist 23 { 24 25 public function __construct() 26 { 27 echo 'Class NameSpace is "', __NAMESPACE__, '"'; 28 } 29 public function show_list() 30 { 31 for ($i = 0; $i < 5; $i++) { 32 echo "<ul><li>this is order$i<br />"; 33 //內部直接訪問 34 echo detail(); 35 echo "</li></ul>"; 36 } 37 } 38 } 39 //內部通過命名空間訪問 40 echo \Order\call_by_self();
index.php 內容為:
1 <?php 2 /** 3 * @Author: Martin 4 * @Support: Martin 5 * @Last Modified by: Martin 6 */ 7 namespace index; 8 include_once('Order.php'); 9 10 //外部訪問class 實例化即可使用 11 use Order\Orderlist; 12 $orderlist = new orderlist; 13 $orderlist->show_list(); 14 15 //外部訪問靜態變量和function 直接訪問 16 use Order; 17 echo Order\STR; 18 echo Order\detail();
打印結果為:
以上內容包含了:通過命名空間來訪問文件和直接實例化訪問,以及本空間直接訪問。
命名空間的存在是為了防止兩個同名的class都被載入,使用命名空間在加載第三方的類時能避免同名沖突。
下面來說一下自動加載
SPL 的全稱是:Standard PHP Library PHP標准庫,在PHP5以后已經內置在PHP中,無需另外安裝。
SPL包含了一套針對數據結構、迭代器、異常、文件處理等的函數庫。
自動裝載庫有以下函數
spl_autoload_call:嘗試調用所有已注冊的__autoload()函數來裝載請求類
User.php 內容為:
1 namespace User; 2 //直接載入Order 3 #include('Order.php'); 4 //自動載入 5 spl_autoload_register(function($className) { 6 var_dump($className); 7 }); 8 spl_autoload_call('Order');
打印結果為:
SPL自動載入函數包含如下:
spl_autoload_extensions: 注冊並返回spl_autoload函數使用的默認文件擴展名。
get_include_path: 設置默認引用的文件夾
spl_autoload_register: 自動引入文件
實際操作如下:
我們重新調整目錄結構和並復制order 到 lib下面 如下:
修改User.php 如下:
1 namespace User; 2 3 //直接載入Order 4 #include('Order.php'); 5 //自動載入 6 define('LIB_DIR', __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR); 7 spl_autoload_register(function ($class) { 8 $path = LIB_DIR . $class . '.lib.php'; 9 include ($path); 10 }); 11 12 spl_autoload_call('Order'); 13 use Order; 14 15 $orderList = new \Order\Orderlist(); 16 $orderList->show_list();
打印結果為:
注意:
當采用SPL載入文件時,use並不能觸發spl_autoload_register函數,他會被new觸發,這樣就會提示找不到文件,
所有采用spl_autoload_call 來提前觸發自動載入。