spl_autoload_register自动加载类回调函数实现

随手写的,后台发现用不上,放上来以后可能用的着

  1 /**
  2  * SPL自动加载类
  3  */
  4 class AutoLoad
  5 {
  6
  7     /**
  8      * 类文件所在目录
  9      *
 10      * @var string
 11      */
 12     protected $dir = "";
 13
 14     /**
 15      * 类名与目录名映射数组
 16      *
 17      * @var array
 18      */
 19     protected $map = array();
 20
 21     /**
 22      * 初始化自动加载类
 23      *
 24      * @param string $dir
 25      *            类文件所在目录
 26      * @param array|string $map
 27      *            类名称与目录名称映射,字符串方式:如果Zend命名空间映射到Zf2,写法:Zend|Zf2
 28      */
 29     public function __construct($dir, $map = [])
 30     {
 31         if (! $dir) {
 32             throw new Exception("类目录不能为空", 2001);
 33         }
 34         $dirLastChar = substr($dir, - 1, 1);
 35         if ($dirLastChar != "/" && $dirLastChar != "\\") {
 36             $dir .= DIRECTORY_SEPARATOR;
 37         }
 38         $this->dir = $dir;
 39
 40         if (is_string($map)) {
 41             $mapTmp = explode(",", $map);
 42             $mapList = [];
 43             foreach ($mapTmp as $key => $item) {
 44                 $tmpArr = explode("|", $item);
 45                 if (count($tmpArr) >= 2) {
 46                     if ($tmpArr[0] && $tmpArr[1]) {
 47                         $mapList[$tmpArr[0]] = $tmpArr[1];
 48                     }
 49                 } elseif (count($tmpArr) == 1) {
 50                     if ($tmpArr[0]) {
 51                         $mapList[$tmpArr[0]] = $tmpArr[0];
 52                     }
 53                 }
 54             }
 55
 56             $map = $mapList;
 57         }
 58
 59         foreach ($map as $key => $item) {
 60             if ($key && $item) {
 61                 $this->addMap($key, $item);
 62             }
 63         }
 64     }
 65
 66     function addMap($namespace, $path)
 67     {
 68         $this->map[$namespace] = $path;
 69     }
 70
 71     /**
 72      * 获取类映射数组
 73      */
 74     function getMap()
 75     {
 76         return $this->map();
 77     }
 78
 79     function clearMap()
 80     {
 81         $this->map = array();
 82     }
 83
 84     /**
 85      * SPL类自动加载函数
 86      *
 87      * @param string $className
 88      */
 89     public function load($className)
 90     {
 91         if (! $className) {
 92             return false;
 93         }
 94         $arr = explode("\\", $className);
 95         $nameSpace = isset($arr[0]) ? $arr[0] : "";
 96
 97         if (! $nameSpace) {
 98             return false;
 99         }
100         if (! isset($this->map[$nameSpace])) {
101             return false;
102         }
103         unset($arr[0]);
104
105         $fileName = implode(DIRECTORY_SEPARATOR, $arr);
106         $path = $this->dir . $this->map[$nameSpace] . DIRECTORY_SEPARATOR . $fileName . ".php";
107         require ($path);
108     }
109 }

调用示例

1 require ‘AutoLoad.php‘;
2         $autoload= new AutoLoad("Zend|Zf2");
3         spl_autoload_register(array($autoload,"load"));
时间: 2024-10-14 01:25:31

spl_autoload_register自动加载类回调函数实现的相关文章

【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把 这个文件引入.不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时 候,再把这个类所在的php文件导入呢?这就是我们这里我们要

xdebug下用 spl_autoload_register 自动加载类文件时,会出现超时

如题

自动加载类PHP中spl_autoload_register函数的用法

spl_autoload_register(PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中.因为 spl_autoload_

_autoload 自动加载类和spl_autoload_register()函数

一._autoload 自动加载类:当我们实例化一个未定义的类时,就会触此函数.到了php7.1以后版本不支持此函数好像抛弃了 新建一个类文件名字自己随便去:news类在auto.php文件里面去实例news类而没有引入该类,可以用_autoload自动加载方法类去处理. news.class.php文件 class news{ function do_new() { echo 'aaa'; } } auto.php文件使用_autoload函数要定义函数体自己去定义 function __au

php 自动加载函数、自动加载方法、自动加载类

在PHP开发过程中,如果希望从 外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来.这个在小规模开发的时候,没什么大问 题.但在大型的开发项目中,这么做会产生大量的require或者include方法调用,这样不因降低效率,而且使得代码难以维护,况且 require_once的代价很大. 在PHP5之前,各个PHP框架如果要实现类的自动加载,一般都是按照某种约定自己实现一个遍历 目录,自动加载所有符合约定规则的文件的类或函数. 当然,PHP

php中自动加载类_autoload()和spl_autoload_register()实例详解

一._autoload 自动加载类:当我们实例化一个未定义的类时,就会触此函数.到了php7.1以后版本不支持此函数好像抛弃了 新建一个类文件名字自己随便去:news类在auto.php文件里面去实例news类而没有引入该类,可以用_autoload自动加载方法类去处理. news.class.php文件 class news{ function do_new() { echo 'aaa'; } } auto.php文件使用_autoload函数要定义函数体自己去定义 function __au

框架开发(五)----自动加载类

一 . 为什么自动加载 自动加载字面的意思就不解释了.我这里自动加载类解析下 是自动加载类文件的意思.__autoload方法完全可行,但是不要问为什么,还是用spl_autoload_register.不只是灵活,而且就是灵活,还是灵活,体现在__autoload只能这么命名,spl_auto_register() 能调用不同的函数. 二  自动加载函数原理   通常情况下,一个类的定义都是一个文件,当类与类需要相互引用的时候,就需要include(require)相应的类文件,带来的问题就是

php7扩展自动加载类.

使用php扩展来开发框架似乎越来越来成来主流了,如phalcon,鸟哥的yaf.这些框架都以高性能著称,相对纯php使用的框架而,php扩展实现的框架更快,不会带来额外的系统消耗.在php启动时便已加载了框架,并且常驻内存. 几乎所有框架都带自动加载类,以便更好的管理代码.php实现方法这里就不多介绍了,读者可以自行百度.这里将介绍如何在php扩展中实现. 扩展中的实现原理与php实现基本原理一致,都是基于 spl_autoload_register 函数实现. ZEND_METHOD(lxx_

final关键字, 自动加载类

final关键字 如果父类中的方法被声明为 final,则子类无法覆盖该方法.如果一个类被声明为 final,则不能被继承. 属性不能被定义为 final,只有类和方法才能被定义为 final 自动加载类 很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件). 在 PHP 5 中,不再需要这样了.可以定义一个 __autoload() 函数,它会在试图使用尚未被定义的类时自动调用.通过调用此函数,脚