一、 還記得自動裝載魔術方法的缺陷吧,通常解決的方案就是寫個判斷,把最常用的類寫在第一個判斷中,例如:
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.php、Tc2/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();
注意:使用註冊加命名空間實例化類時,如果需要實例化系統類,必須在系統類前面加上“\”。