PHP 实现自动加载器(Autoloader)

   我们知道PHP可以实现自动加载,避免了繁重的体力活,代码更规范,整洁。那如果我们把这个自动加载再升华一下,变成自动加载类,每次只需要引入这个类,那么其他类就自动加载了,已经开源,仓库地址在这里。同时如果加载后可以使其常驻内存,那么效率又高了。。。

关于自动的基础部分在前一篇博客(http://www.cnblogs.com/CpNice/p/4119925.html);

下面有几点需要注意

1.为了实现通用性,设置一个根目录,在大型项目中,目录结构比较复杂,每次加载都应该有一个起始开始的目录位置,这样才能向后兼容。当然也可以设置多个这种目录,放到数组里。

2.带有命名空间的类,需要把转义符转换成表示目录结构的斜线,加载的类是带有命名空间的,因为,该类是属于该命名空间下。(从上一篇博客就可以知道)

好了,下面贴上代码

 1 <?php
 2 
 3 if(!defined('ROOTDIR'))
 4 {
 5         define('ROOTDIR',realpath(__DIR__.'/../'));   //定义更目录
 6 }
 7 class Autoloader {
 8         
 9         public static function myAutoload( $name )
10         {
11                 $class_path = str_replace('\\',DIRECTORY_SEPARATOR,$name);
12                 $file = ROOTDIR.'/'.$class_path.'.php';
13                 if( file_exists( $file ) )
14                 {
15                         require_once( $file );
16                         if( class_exists($name, false) )
17                         {
18                                 return true;
19                         }
20                 }
21                 return false;
22         }
23 }
24 spl_autoload_register('Autoloader::myAutoload');

自动加载的使用必须显示加载,它是加载其他类的加载器,我们已经重载了PHP的自动加载没有机制可以加载这个Autoloader,所以要 require_once('Autoloader.php');

很简单吧,其实这个可以做的更强大。

比如,我把这个做成一个中间件,命名为Bootstrap,这个可以用于不同项目,而这些项目可以位于不同或者同一个WEB目录下,这时需要一个静态的属性表示所有可能的应用目录或者不同WEB目录

1 public static $rootPath = array();

在加载时,就需要一个循环遍历每一个可能的目录,找到即加载。

同时,我们可以设置一个 setRootPath() 方法,用于设置不同项目的目录。

public function setRootPath( $path )
{
        //do something
        return $this;
}

这样就能实现链式操作的添加,个人觉得比较神奇。。。

 

OK,关于自动加载就写到这里,欢迎各位看官拍砖。

 

posted @ 2015-03-26 20:35  nice_cp  阅读(9516)  评论(3编辑  收藏  举报