composer安装使用,依赖管理源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w15249243295/article/details/52396348

centos上安装使用:

curl -sS https://getcomposer.org/installer | php (-- --install-dir=bin)指定安装目录


安装依赖:

1.新建一个composer.json文件

{
    "require": {
        "monolog/monolog": "1.2.*"
    }
}
php composer.phar install
composer install

2.自动安装

composer require ""

composer.json 里面是定义的一些依赖
composer.lock 锁文件,在安装依赖后,Composer 将把安装时确切的版本号列表写入 composer.lock 文件。这将锁定改项目的特定版本。
composer.phar 用来执行 php composer.phar install ,如果composer命令加入到path中,也可以通过composer  install来安装依赖
vendor 依赖存放的目录


扫描二维码关注公众号,回复: 6129165 查看本文章

管理依赖
require 'vendor/autoload.php';

<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer' . '/autoload_real.php';

return ComposerAutoloaderInita8484003a73b0020b426c07d5f5a0c87::getLoader();


vendor/composer/autoload_real.php

<?php

class ComposerAutoloaderInita8484003a73b0020b426c07d5f5a0c87
{
    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;
        }
          //注册自动加载函数,目的就是加载ClassLoader.php
        spl_autoload_register(array('ComposerAutoloaderInita8484003a73b0020b426c07d5f5a0c87', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInita8484003a73b0020b426c07d5f5a0c87', 'loadClassLoader'));

          //加载HTMLPurifier,Diff,
        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->set($namespace, $path);//Registers a set of PSR-0 directories for a given prefix,
        }

          //autoload_psr4.php里面定义了namespace和目录的键值对,自动加载就是通过这个部分实现的
        $map = require __DIR__ . '/autoload_psr4.php';
        foreach ($map as $namespace => $path) {
            $loader->setPsr4($namespace, $path);//Registers a set of PSR-4 directories for a given namespace,
        }

          //autoload_classmap.php里面是空的,主要应该是类名到文件名的映射
        $classMap = require __DIR__ . '/autoload_classmap.php';
        if ($classMap) {
            $loader->addClassMap($classMap);//Class to filename map
        }
          //注册这个自动加载函数
        $loader->register(true);

        $includeFiles = require __DIR__ . '/autoload_files.php';
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequirea8484003a73b0020b426c07d5f5a0c87($fileIdentifier, $file);
        }
          //这一行可以注释
        return $loader;
    }
}

function composerRequirea8484003a73b0020b426c07d5f5a0c87($fileIdentifier, $file)
{
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
        require $file;

        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
    }
}


vendor/composer/ClassLoader.php 真正的自动加载函数

public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

    /**
     * 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;
        }
    }



猜你喜欢

转载自blog.csdn.net/w15249243295/article/details/52396348