多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 类的自动加载 include和require关键字是通过手动方式对对应文件进行包含,实际上php提供了一个更方便的,类的自动加载方法 通过魔术方法 `__autoload(string $class)` 实现,也可以通过函数 `spl_autoload_register` 注册一个自动加载方法 ~~~ function __autoload($class) { require_once($class.".php"); } ~~~ 通常用spl_autoload_register注册自定义的函数作为自动加载类实现,因为`__autoload()`魔术方法只可以定义一次 # laravel中的使用 类的自动加载函数是在Composer\Autoload\ClassLoader类中实现的,实例化该类并将类的命名空间与文件路径的对应关系注册到相应属性中,然后通过实例方法 `register($prepend=false)` 注册一个类自动加载函数,即为该类实例的loadClass方法,并且将其注册在类自动加载函数队列的末尾,当使用一个为包含的类名时,会自动调用loadClass方法并通过参数获取包含命名空间的类名信息,接着根据类的命名空间与文件路径的对应关系查找文件路径,最后通过includeFile()函数包含该文件,实现类的自动加载 默认laravel包含2个类的自动加载函数,其中一个是在外观注册(`Illuminate\Foundation\Bootstrap\RegisterFacades`类实现的)过程中实现的,在注册过程中也是先实例化后调用register()函数,进而调用prependToLoaderStack()函数,将`load($alias)`函数注册为类的自动加载函数,该函数的作用主要是将外观别名与外观名(Facades)对应起来,从而实现对应外观类的静态方法调用 ~~~ <?php namespace Illuminate\Foundation; class AliasLoader { //加载一个类别名,实际上是给外观类起了一个别名,使两者对应一个类 public function load($alias) { if (isset($this->aliases[$alias])) { return class_alias($this->aliases[$alias], $alias); } } //添加别名到自动加载函数中 public function alias($class, $alias) { $this->aliases[$class] = $alias; } //注册自动加载函数到自动加载堆栈中 public function register() { if (! $this->registered) { $this->prependToLoaderStack(); $this->registered = true; } } //将类的自动加载函数添加到自动加载堆栈首部 protected function prependToLoaderStack() { spl_autoload_register([$this,'load'],true,true); } } ~~~