php自动加载的两种实现方法 |
本文标签:php,自动加载 php自动载方法有两种. 第一种方案用__autoload,这个函数较简单,也较弱. 但有一问题没有解决, 就是在include前判断文件是否存在的问题. 复制代码 代码如下: set_include_path(aa . PATH_SEPARATOR . get_include_path()); function __autoload($className) { //如果加这个检测, 因为此文件不在当前目录下,它就会检测不到文件存在, //但include是能成功的 if (file_exists($className . .php)) { include_once($className . .php); } else { exit(no file); } } $a = new Acls(); 第二种方案用spl自动加载,这里具体说一下这个. spl_autoload_register() 一个简单的例子 复制代码 代码如下: set_include_path(aa . PATH_SEPARATOR . get_include_path()); //function __autoload($className) //{ // if (file_exists($className . .php)) { // include_once($className . .php); // } else { // exit(no file); // } //} spl_autoload_register(); $a = new Acls(); spl_autoload_register()会自动先调用spl_autoload()在路径中查找具有小写文件名的".php"程序.默认查找的扩展名还有".ini",还可以用spl_autoload_extenstions()注册扩展名. 在找不到的清况下,还可以通过自己定义函数查找 如 function loader1($class) { //自己写一些加载的代码 } function loader2($class) { //当loader1()找不到时,我来找 } spl_autoload_register(loader1); spl_autoload_register(loader2); 还可以更多........ MVC框架是如何实现自动加载的 首先设置路径 include => array( application/catalog/controllers, application/catalog/models, ),$include = array(application/controllers, application/models, application/library); set_include_path(get_include_path() . PATH_SEPARATOR .implode(PATH_SEPARATOR, $config[include])); 在获取URL,解析出控制器与方法. 然后设置自动加载 复制代码 代码如下: class Loader { /** * 自动加载类 * @param $class 类名 */ public static function autoload($class) { $path = ; $path = str_replace(_, /, $class) . .php; include_once($path); } } /** * sql自动加载 */ spl_autoload_register(array(Loader, autoload)); 路由,实例化控制器,调用方法,你写的东西就开始执行了 复制代码 代码如下: /** * 路由 */ public function route() { if (class_exists($this->getController())) { $rc = new ReflectionClass($this->getController()); if ($rc->hasMethod($this->getAction())) { $controller = $rc->newInstance(); $method = $rc->getMethod($this->getAction()); $method->invoke($controller); } else throw new Exception(no action); } else throw new Exception(no controller); } 初步的自动加载就完成了 |