前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >composer实现自动加载代码备忘录(一)

composer实现自动加载代码备忘录(一)

作者头像
咪啪咪啪
发布2019-11-15 20:08:27
5760
发布2019-11-15 20:08:27
举报
文章被收录于专栏:PHP-咪啪咪啪PHP-咪啪咪啪
autoload_real.php源码中第一部分:
代码语言:javascript
复制
<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit0d73cb3edef790764ea1c1c8b396cb13
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit0d73cb3edef790764ea1c1c8b396cb13', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit0d73cb3edef790764ea1c1c8b396cb13', 'loadClassLoader'));
.
.
.

这个文件定义了一个ComposerAutoloaderInit+Hash值命名的类,先看上面这段代码中的几个点。

  1. 定义了私有静态属性$loader
  2. 定义了静态方法loadClassLoader()
  3. 定义了静态方法getLoader()

这三点的作用:

  1. 静态属性$loader是因为后面在静态方法中的getLoader()中有一段
代码语言:javascript
复制
<?php
.
.
.
if (null !== self::$loader) {
return self::$loader;
}

这个是最简单的单例模式,因此$loader就是为了接收对象

  1. 静态方法loadClassLoader()的作用是为了require ClassLoader.php这个文件
代码语言:javascript
复制
if ('Composer\Autoload\ClassLoader' === $class) {
    require __DIR__ . '/ClassLoader.php';
}

这个类的参数$class为什么与'Composer\Autoload\ClassLoader'相等,是因为第三点

  1. 静态方法getLoader()中的代码
代码语言:javascript
复制
 spl_autoload_register(array('ComposerAutoloaderInit0d73cb3edef790764ea1c1c8b396cb13', 'loadClassLoader'), true, true);
 self::$loader = $loader = new \Composer\Autoload\ClassLoader();
 spl_autoload_unregister(array('ComposerAutoloaderInit0d73cb3edef790764ea1c1c8b396cb13', 'loadClassLoader'));

首先通过spl_autoload_register()这个函数通过回调函数的机制在自动加载堆栈中注册了一个方法,这个方法就是

代码语言:javascript
复制
ComposerAutoloaderInit0d73cb3edef790764ea1c1c8b396cb13::loadClassLoader();

注册好了自动加载之后,紧接着

代码语言:javascript
复制
self::$loader = $loader = new \Composer\Autoload\ClassLoader();

上面那段代码先执行new \Composer\Autoload\ClassLoader();因为这个类并不存在(因为我们之前并没有require过),所以就调用了堆栈中的loadClassLoader()方法,因此就执行了

代码语言:javascript
复制
public static function loadClassLoader($class)
 {
    if ('Composer\Autoload\ClassLoader' === $class) {
        require __DIR__ . '/ClassLoader.php';
    }
}

这个$class参数就是上面new的类名,也就是Composer\Autoload\ClassLoader因此走进了if判断,进而

代码语言:javascript
复制
require __DIR__ . '/ClassLoader.php';

导入进了ClassLoader.php,这一部分就梳理完了 注:

  1. 回调函数可以用数组形式实现调用,
代码语言:javascript
复制
array('A','test');

当使用回调函数的时候,用数组形式传递,那么A就指的是类名,test是A类中的静态方法,方法必须是静态的

代码语言:javascript
复制
array($obj,'test');

$obj是实例化的对象,test是该对象的方法

附文档和参考文献:

  1. http://hanfeng.name/blog/2015/08/17/composer-autoload/
  2. spl_autoload_register(); http://php.net/manual/zh/function.spl-autoload-register.php
  3. 回调函数: http://php.net/manual/zh/language.types.callable.php
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • autoload_real.php源码中第一部分:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档