Laravel如何实现自动加载类
发布:smiling 来源: PHP粉丝网 添加日期:2022-01-04 19:39:41 浏览: 评论:0
今天小编就为大家整理了一篇Laravel如何实现自动加载类的问题,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。
本人水平有限,如有错误望告知,谢谢!
Laravel如何实现自动加载类
Laravel使用的是composer的自动加载。
首先看 vendor/autoload.php文件
- <?php
- // autoload.php @generated by Composer
- require_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方法,加载需要的类。
Tags: Laravel自动加载类
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)