gpt4 book ai didi

Laravel框架中composer自动加载的实现分析

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Laravel框架中composer自动加载的实现分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

基础 。

自动加载允许你通过即用即加载的方式来加载需要的类文件,而不用每次都写繁琐的require 和include语句。因此,每一次请求的执行过程都只加载必须的类,也不不要关心类的加载问题,只要需要的时候直接使用即可.

laravel 框架是通过composer 实现的自动加载.

是通过  下面的代码实现的.

?
1
2
require_once __DIR__ . '/composer' . '/autoload_real.php' ;
return ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f::getLoader();

首先我们对spl_autoload_register和spl_autoload_unregister 这两个函数进行解释一下.

spl_autoload_register 自动注册 一个或多个 自动加载函数,这些函数一般在 实例化类的时候,自动运行.

spl_autoload_unregister 恰恰相反.

贴上我实验的代码:

这是autoload.php 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
/**
  * Created by PhpStorm.
  * User: Administrator
  * Date: 2017/12/7
  * Time: 14:10
  */
namespace app;
class Autoload {
 
  public function __construct()
  {
   $this ->autoload();
  }
  public function autoload(){
   // spl_autoload_register(array('Autoload','ss'),true); 会触发致命错误,必须带上命名空间
   spl_autoload_register( array ( 'app\Autoload' , 'ss' ),true);
  }
  public function ss(){
   echo 666;
   exit ;
  }
}

这是index.php 。

?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
/**
  * Created by PhpStorm.
  * User: Administrator
  * Date: 2017/12/7
  * Time: 14:10
  */
require 'autoload.php' ;
$autoload = new \app\Autoload();
$b = new B(); // 此时自动运行自动加载函数
echo 77;
exit ;

找到getLoader 这个函数,并对其进行分析:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static function getLoader()
  {
   if (null !== self:: $loader ) {
    return self:: $loader ;
   }
   //注册自动加载函数,在加载或实例化类,运行loadClassLoader函数
   spl_autoload_register( array ( 'ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f' , 'loadClassLoader' ), true, true);
   self:: $loader = $loader = new \Composer\Autoload\ClassLoader();
   spl_autoload_unregister( array ( 'ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f' , 'loadClassLoader' ));
/********************1********************************************************
   $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 );
   }
/********************1********************************************************
   $loader ->register(true);  $includeFiles = require __DIR__ . '/autoload_files.php' foreach ( $includeFiles as $fileIdentifier => $file ) {   composerRequire7b20e4d61e2f88170fbbc44c70d38a1f( $fileIdentifier , $file );  }  return $loader ; }}

/***** 包围的部分,主要对ClassLoader 中的 。

$prefixesPsr0   、$prefixDirsPsr4  、$classMap 等属性进行赋值。即加载一些配置好的文件,在后面进行加载或寻找文件时候,就是从加载的配置文件中寻找。寻找要加载的类主要通过register 函数来实现。然后分析register函数.

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

发现实际将该类中loadClass 函数注册为自动加载函数。于是开始分析loadClass函数,最终是通过findFile进行类的寻找.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public function findFile( $class )
{
/// 特别注意 参数$class 是根据命名空间生成的class名称,具体请参考命名空间特性。
  // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
  if ( '\\' == $class [0]) {
   $class = substr ( $class , 1);
  }
  // class map lookup 首先从加载的classMap 中寻找
  if (isset( $this ->classMap[ $class ])) {
   return $this ->classMap[ $class ];
  }
  if ( $this ->classMapAuthoritative) {
   return false;
  }
// 从刚才加载的配置文件中寻找文件。先按照 psr4 规则寻找,再按照psr0 寻找
// 两种规则的不同主要是对下划线的处理方式。
  $file = $this ->findFileWithExtension( $class , '.php' );
  // Search for Hack files if we are running on HHVM
  if ( $file === null && defined( 'HHVM_VERSION' )) {
   $file = $this ->findFileWithExtension( $class , '.hh' );
  }
  if ( $file === null) {
   // Remember that this class does not exist.
   return $this ->classMap[ $class ] = false;
  }
  return $file ;
}

至此register函数分析完。我们接着分析getLoader函数剩余代码.

?
1
2
3
4
$includeFiles = require __DIR__ . '/autoload_files.php' ;
foreach ( $includeFiles as $fileIdentifier => $file ) {
  composerRequire7b20e4d61e2f88170fbbc44c70d38a1f( $fileIdentifier , $file );
}

这段代码其实就是加载autoload_file.php 文件.

总结 。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.

原文链接:http://blog.csdn.net/qq_16877261/article/details/77707453 。

最后此篇关于Laravel框架中composer自动加载的实现分析的文章就讲到这里了,如果你想了解更多关于Laravel框架中composer自动加载的实现分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com