经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
Laravel如何实现自动加载类
来源:jb51  时间:2019/10/15 10:47:37  对本文有异议

本人水平有限,如有错误望告知,谢谢!

Laravel如何实现自动加载类

Laravel使用的是composer的自动加载。

首先看 vendor/autoload.php文件

  1. <?php
  2. // autoload.php @generated by Composer
  3. require_once __DIR__ . '/composer/autoload_real.php';
  4. return ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3::getLoader();

代码很少,查看__DIR__ . '/composer/autoload_real.php'文件。 有一个类ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3,该类的名字比较奇特,主要为了防止重名。回到上面的代码,可以看到调用了getLoader()方法;

看一下部分代码

  1. if (null !== self::$loader) {
  2. return self::$loader;
  3. }
  4.  
  5. spl_autoload_register(array('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3', 'loadClassLoader'), true, true);
  6. self::$loader = $loader = new \Composer\Autoload\ClassLoader();
  7. spl_autoload_unregister(array('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3', 'loadClassLoader'));
  8.  

这里自动加载了当前类的loadClassLoader静态方法,该方法加载了__DIR__ . '/ClassLoader.php'文件,该文件中的类起到了整个框架类自动加载的作用。

回到autoload_real.php文件的getLoader()方法,看剩下部分代码

  1. $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
  2. if ($useStaticLoader) {
  3. require_once __DIR__ . '/autoload_static.php';
  4.  
  5. call_user_func(\Composer\Autoload\ComposerStaticInit5586036d8fdd45ae351f9a5ae924a5a3::getInitializer($loader));
  6. } else {
  7. $map = require __DIR__ . '/autoload_namespaces.php';
  8. foreach ($map as $namespace => $path) {
  9. $loader->set($namespace, $path);
  10. }
  11.  
  12. $map = require __DIR__ . '/autoload_psr4.php';
  13. foreach ($map as $namespace => $path) {
  14. $loader->setPsr4($namespace, $path);
  15. }
  16.  
  17. $classMap = require __DIR__ . '/autoload_classmap.php';
  18. if ($classMap) {
  19. $loader->addClassMap($classMap);
  20. }
  21. }

这里主要加载一些自动加载类相关的资源。

随后调用$loader->register(true);

这个方法比较重要

  1. public function register($prepend = false)
  2. {
  3. spl_autoload_register(array($this, 'loadClass'), true, $prepend);
  4. }

注册了loadClass方法,并且是放在队列的head。

查看loadClass方法

  1. /**
  2. * Loads the given class or interface.
  3. *
  4. * @param string $class The name of the class
  5. * @return bool|null True if loaded, null otherwise
  6. */
  7. public function loadClass($class)
  8. {
  9. if ($file = $this->findFile($class)) {
  10. includeFile($file);
  11.  
  12. return true;
  13. }
  14. }

当实例化类的时候,找不到类,就自动会调用该方法,该方法加载了需要的类,这个方法十分重要。

现在看一下$this->findFile($class)方法内使用了之前getLoader()方法加载的相关资源。

现在整个Laravel框架如何自动加载类已经很明显了。每当实例化类的时候,会自动调用 ClassLoader的loadClass方法,加载需要的类。

以上这篇Laravel如何实现自动加载类就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号