在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实例化好