Laravel 自动加载
来源:互联网 发布:广东新丰网络问政平台 编辑:程序博客网 时间:2024/06/01 07:32
本人水平有限,如有错误望告知,谢谢!
Laravel如何自动加载类
Laravel
使用的是composer
的自动加载。
首先看 vendor/autoload.php
文件
<?php// autoload.php @generated by Composerrequire_once __DIR__ . '/composer/autoload_real.php';return ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3::getLoader();
代码很少,查看__DIR__ . '/composer/autoload_real.php'
文件。 有一个类ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3
,该类的名字比较奇特,主要为了防止重名。回到上面的代码,可以看到调用了getLoader()
方法;
看一下部分代码
if (null !== self::$loader) { return self::$loader; } spl_autoload_register(array('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3', 'loadClassLoader'));
这里自动加载了当前类的loadClassLoader
静态方法,该方法加载了__DIR__ . '/ClassLoader.php'
文件,该文件中的类起到了整个框架类自动加载的作用。
回到autoload_real.php
文件的getLoader()
方法,看剩下部分代码
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit5586036d8fdd45ae351f9a5ae924a5a3::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } }
这里主要加载一些自动加载类相关的资源。
随后调用$loader->register(true);
这个方法比较重要
public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); }
注册了loadClass
方法,并且是放在队列的head。
查看loadClass
方法
/** * Loads the given class or interface. * * @param string $class The name of the class * @return bool|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } }
当实例化类的时候,找不到类,就自动会调用该方法,该方法加载了需要的类,这个方法十分重要。
现在看一下$this->findFile($class)
方法内使用了之前getLoader()
方法加载的相关资源。
现在整个Laravel
框架如何自动加载类已经很明显了。每当实例化类的时候,会自动调用 ClassLoader
的loadClass
方法,加载需要的类。
0 0
- Laravel 自动加载
- laravel自动加载
- Laravel自动加载类教程
- laravel composer自动加载函数
- laravel框架学习-自动加载项目
- laravel源码阅读之自动加载功能
- 每天laravel[002]-自动加载函数流程
- Laravel 框架 自动加载实现分析
- php laravel 源码阅读3(注册自动加载)
- Laravel 加载PHPEXCEL
- Laravel 加载第三方类库
- laravel加载css文件
- laravel加载外部类
- php composer 在laravel中自动加载autoload_class.php中的配置
- [李景山php]每天laravel[002]-自动加载函数流程之bootstrap autoload.php
- [李景山php]每天laravel[003]-自动加载函数流程之vendor autoload.php
- [李景山php]每天laravel[004]-自动加载函数流程之composer autoload_real.php
- 每天laravel[002]-自动加载函数流程之bootstrap autoload.php
- 使用C++实现一套简单的状态机模型——实例
- Til the Cows Come Home
- Linux之grub的运行机制及grub修复
- 1.Android入门
- 蓝桥杯 算法训练01 Java实现
- Laravel 自动加载
- Postgresql 条件表达式
- 使用NIO实现非阻塞式的网络通信
- 基于最大稳定区域的图像分割算法
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- HTML/CSS基础
- Vue项目搭建
- linux error: expected declaration specifiers or '...' XXX
- Ant Counting POJ - 3046 多重集组合数