在MVC架構中,通常我們将Smarty模闆對象建立在父類控制器(Controller)中.通過執行個體化得到smarty對象,供子類使用.
在初始檔案init.php中有個我們定義的自動加載函數。然而,smarty在自己内部也定義了一個自動加載函數.
當我們執行個體化某個對象執行個體的時候,程式應該走哪個自動加載函數呢?
關于自動加載的分析:
①實作PHP内部預保留的一個函數
function __autoload($classname){
if(in_array($classname,$array)){
include $classname.".class.php";
}
}
②定義一個函數,然後通過注冊,使其成為自動加載函數
注冊自動加載函數:spl_autoload_register(callback $autoloadfunction);
function Mydefineautoload($classname){
if(in_array($classname,$array)){
include $classname.".class.php";
}
}
spl_autoload_register("Mydefineautoload");
③将方法注冊成為一個自動加載函數
class bookstore{
spl_autoload_register(array('bookstore','defineautoload'));
//使用數組,第一個元素代表哪個類,第二個元素表示需要被注冊的方法,其方法必須是個靜态方法
public static function defineautoload($classname){
if(in_array($classname,$array)){
include $classname.".class.php";
}
}
}
//如果在外邊
spl_autoload_register("bookstore::defineautoload");
上面我們總結了三種方式來定義自動加載,那如果在程式中既有__autoload()又有我們自己注冊的自動加載函數
那程式會走哪個自動加載函數呢?
這裡有一個優先級的問題:
①注冊的自動加載函數或者方法,其優先級要比__autoload()的優先級要高
②對于注冊的自動加載函數或者方法,其優先級都是平級,無先後之分,程式會走兩個注冊的自動加載方法
spl_autoload_register可以提高通路級别
smarty在項目中使用需要注意:
一 處理好spl_autoload_register
二 模闆通過smarty來使用
三 在父類裡邊把smarty執行個體化好