【PHP高級】自動裝載與名字空間


一、 還記得自動裝載魔術方法的缺陷吧,通常解決的方案就是寫個判斷,把最常用的類寫在第一個判斷中,例如:

function __autoload($fileName){

if(file_exists("tc1/".$fileName.".php"))

require_once("tc1/".$fileName.".php");

elseif(file_exists("tc2/".$fileName.".php"))

require_once("tc2/".$fileName.".php");

//elseif……

}

 

$tc1=new tc1();

$tc2=new tc2();

 

隨着頁面地址的複雜,以上的解決方案可能需要寫很多的判斷語句,不確定的是想要實例化哪一個文件夾下哪一個類文件,那麼需要剛開始就把所有文件夾下的類全部以判斷的形式寫好。可以對每一個需要裝載的類使用spl_autoload_register分別註冊匿名函數來加載類。實例源碼

spl_autoload_register(function($fileName){

//必須要有判斷,否則後面的類無法實例化

if(file_exists("tc1/".$fileName.".php"))

require_once("tc1/".$fileName.".php");

});

$tc1=new tc1();//實例化1

 

spl_autoload_register(function($fileName){

if(file_exists("tc2/".$fileName.".php"))

require_once("tc2/$fileName".".php");

});

$tc2=new tc2();//實例化2

//……

 

其中 Tc1/tc1.phpTc2/tc2.php、Tc2/tc1.php代碼詳見下面。

 

最麻煩就是不同的文件夾下有同名的類(文件)實例化哪一個類文件呢?程序會報錯!!!解決的辦法就是使用命名空間(namespace)。

二、 PHP5.3中新增了名字空間,還是以C#的習慣把它稱爲“命名空間”吧,作用和其一樣,也類似與JAVA中架包(package)的概念,來解決類同名的問題。語法:

 

//定義

Namespace 命名空間;

Class 類名{}  

 

//實例化

$c1=new 命名空間\類名();

 

TIPS:新建的類加上命名空間,命名空間要和文件夾名一致!!!

 

示例源碼:

Tc1/tc1.php 中定義類代碼

namespace Tc1;  //駱駝命名法,並且只能放在第一行

class tc1{

function __construct(){echo “tc1”;}

}

 

//Tc2/tc1.php代碼類似

namespace Tc2;  //駱駝命名法,並且只能放在第一行

class tc1{

function __construct(){echo “test2命名空間下的tc1”;}

}

 

//實例化

$tc1=new Tc1\tc1();

$tc11=new Tc2\tc1();

 

TIPS:命名空間最好和其他語言一樣作爲文件夾存在並區分大小寫,類文件放在該文件夾下(可以有子命名空間);調用時雖然不區分大小寫,建議還是大小寫保持一致(UNIX區分);命名空間定義代碼要放在第一行。

 

命名空間與自動裝載:掌握了以上知識點,我們來寫個自動裝載並實例化的案例

spl_autoload_register(function($fileName){

//if(file_exists($fileName.".php"))//想一想爲什麼此時無須判斷

require_once($fileName.".php");

});

//實例化2個命名空間(文件夾)下2同名類

$tc1=new Tc1\tc1();

$tc2=new Tc2\tc2();

$tc11=new Tc2\tc1();

 

注意:使用註冊加命名空間實例化類時,如果需要實例化系統類,必須在系統類前面加上\”。

發佈了83 篇原創文章 · 獲贊 12 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章