程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP命名空間和自動加載初探,php命名空間初探

PHP命名空間和自動加載初探,php命名空間初探

編輯:關於PHP編程

PHP命名空間和自動加載初探,php命名空間初探


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

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved