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函數使用的默認文件擴展名。
修改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 來提前觸發自動載入。 本文地址:http://www.cnblogs.com/martin-tan/p/4864539.html 問題: 使用get_include_path,spl_autoload_extensions並且spl_autoload_register默認為空的情況下並不能直接載入目錄下的文件,原因如上。(?)