精华内容
下载资源
问答
  • Composer

    2019-07-23 10:26:05
    composer将php的一些(绝大多数)的类库总结在了一个网站连接供程序员去查找以及下载 Composer下载:Composer中国官方网站点击下载,在安装之前需要:按要求打开PHP的相关扩展:openssl.dll , mbstring.dll ,及PDO。...

    Composer

    composer将php的一些(绝大多数)的类库总结在了一个网站连接供程序员去查找以及下载

    1. Composer下载:Composer中国官方网站点击下载,在安装之前需要:按要求打开PHP的相关扩展:openssl.dll , mbstring.dll ,及PDO。安装成功之后在cmd中允许 composer-v出现composer等字样表示安装成功(php集成环境phpStudy很好用)
    2. Composer使用:
      下载类库:
      在项目目录下创建composer.json文件并且在里面输入
    {
    "require":{
    		"要下载的类包公司名1/要下载的类包名1":"版本号",
    		"要下载的类包公司名2/要下载的类包名2":"版本号"
    }
    }
    

    想要下载类库可以去下载地址,找到自己想要的类库信息

    在cmd中运行找到当前项目目录(cd 下一目录)运行composer install 即可开始下载

    创建项目:
    找到网站根目录文件输入

    composer create-project 类库公司/类库名称=版本 项目名称(非必选不填为类库名称)
    

    即可创建成功

    展开全文
  • composer

    千次阅读 2017-10-24 16:40:20
    第一步:安装composer,在Linux上。 curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer 安装完成之后输入 # composer -v显示如下说明成功。Do not run Composer as root/...

    安装composer,在Linux上。

    curl -sS https://getcomposer.org/installer | php
    mv composer.phar /usr/local/bin/composer

    第二步:安装完成之后输入

    # composer -v
    显示如下说明成功。
    Do not run Composer as root/super user! See https://getcomposer.org/root for details
       ______
      / ____/___  ____ ___  ____  ____  ________  _____
     / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
    / /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
    \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                        /_/
    Composer version 1.5.2 2017-09-11 16:59:25
    
    Usage:
      command [options] [arguments]
    
    Options:
      -h, --help                     Display this help message
      -q, --quiet                    Do not output any message
      -V, --version                  Display this application version
          --ansi                     Force ANSI output
          --no-ansi                  Disable ANSI output
      -n, --no-interaction           Do not ask any interactive question
          --profile                  Display timing and memory usage information
          --no-plugins               Whether to disable plugins.
      -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
      -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
    

    第二步:接下来进入项目目录

    初始化composer

    composer init
    出现:
    Do not run Composer as root/super user! See https://getcomposer.org/root for details
    
                                                
      Welcome to the Composer config generator  
                                                
    
    
    This command will guide you through creating your composer.json config
    Package name (<vendor>/<name>) [root/test]: 输入名字
    Description []: 输入描述
    Author [, n to skip]:作者信息
    Minimum Stability []: stable  资源包的最低稳定版本,默认为 stable
    Package Type (e.g. library, project, metapackage, composer-plugin) []: 选择你的类型:库、项目。一般用project
    License []: 协议 MIT
    Would you like to define your dependencies (require) interactively [yes]? no
    Would you like to define your dev dependencies (require-dev) interactively [yes]? no
    {
        "name": "mly/test",
        "description": "a test",
        "type": "project",
        "license": "MIT",
        "authors": [
            {
                "name": "mly",
                "email": "249005779@qq.com"
            }
        ],
        "minimum-stability": "stable",
        "require": {}
    }
    Do you confirm generation [yes]?生成上面的文件? yes
    在目录下就生成了composer.json文件


     切换到中国镜像,外国网站太慢 
    

    composer config repo.packagist composer https://packagist.phpcomposer.com  在composer.json所在目录下执行

    接下来

    composer install


    在当前目录下生成了一个文件夹vendor

    vendor目录结构:
    vendor----autoload.php
              ----composer     ----autoload_classmap.php
                                      ----autoload_namespaces.php
                                      ----autoload_psr4.php(自动加载)
                                      ----autoload_real.php
                                      ----autoload_static.php
                                      ----ClassLoader.php
                                      ----installed.json
                                      ----LICENSE


    第三:文件自动加载:例如thinkPHP的function.php的加载

    回到项目目录,新建一个common目录,在common下创建function.php文件,随便写个方法。

    <?php
    function test($str){
        return md5($str);
    }
    

    然后到项目中,打开composer.json文件,添加红色部分,中括号里面就是要引入文件的路径,需要引入其他文件的时候在中括号中加“,”继续写上路径就可以,之后执行composer dump


    {
        "name": "mly/test",
        "description": "a test",
        "type": "project",
        "license": "MIT",
        "authors": [
            {
                "name": "mly",
                "email": "249005779@qq.com"
            }
        ],
        "minimum-stability": "stable",
        "require": {},
        "repositories": {
            "packagist": {
                "type": "composer",
                "url": "https://packagist.phpcomposer.com"
            }
        }
        "autoload":{
            "files":["common/function.php"]
        }
    }


    然后在项目中需要的地方引入vendor下的autoload.php就可以使用。


    自动加载类:

    {
        "name": "mly/test",
        "description": "a test",
        "type": "project",
        "license": "MIT",
        "authors": [
            {
                "name": "mly",
                "email": "249005779@qq.com"
            }
        ],
        "minimum-stability": "stable",
        "require": {},
        "repositories": {
            "packagist": {
                "type": "composer",
                "url": "https://packagist.phpcomposer.com"
            }
        }
        "autoload":{
            "files":["common/function.php"]//文件的自动加载
            "psr-4":{"类的命名空间要双斜杠(App\\Home\\)":"文件路径(相对于composer.json的)"}
        }
    }

    之后运行composer dump

    用到的地方引入autoload.php 然后实例化类就可以了(实例化的时候要加上那个类的命名空间或者use那个命名空间)psr-4:类名要和文件名一样

    如果要用其他的工具类或者别人写好的类或功能

    访问:https://packagist.org/  可以在里面搜索,选择★高的或者下载量大的可能bug比较少,并且有使用文档。

    在项目中运行 composer require +你查找到的类,完成之后到vendor目录下就会看到多了刚才下载的文件

    然后在项目中引入autoload.php 实例化就可以用了




    展开全文
  • composer 简要

    2021-03-10 15:25:01
    #composer <url>https://docs.phpcomposer.com/01-basic-usage.html</url> ## 安装 brew install composer ##配置仓库地址 ``` composer config [-g] repo.packagist composer ...

    composer

    https://docs.phpcomposer.com/01-basic-usage.html

    安装

    brew install composer

    配置仓库地址

    composer config [-g] repo.packagist composer https://packagist.phpcomposer.com
    配置全局的composer仓库地址
    
    编辑项目的composer.json或~/.config/composer/config.json,增加repositories一项配置
    配置项目的composer仓库地址
    

    常用命令

    https://docs.phpcomposer.com/03-cli.html

    composer search **
    根据关键字查找composer依赖包
    
    composer init
    交互式的输入包信息,生成composer.json文件后再补全其他字段信息
    
    composer install [**/***]
    根据composer.json文件自动加载依赖包至vendor目录下,最终安装的依赖包版本可能取决于有无composer.lock文件
    
    composer dump-autoload 
    在vendor目录下自动生成autoload.php
    
    composer update [**/***]
    根据composer.json文件更新项目依赖,相当于删除composer.lock文件后执行composer install
    
    composer require [**/***:***]
    安装composer依赖
    
    composer validate [**/***]
    验证依赖是否可用
    

    composer.json

    https://getcomposer.org/doc/04-schema.md

    {
        "name": "cym/testuse",      //包的名称,由作者名称和项目名称组成,使用/分割(包名称可以包含任何字符,包括空格,并且不区分大小写),但惯例是使用小写字母,并用连字符作为单词的分隔
        "description": "test use package",   //包的功能描述
        "version":"1.0.0",        //版本, 格式必须遵循  X.Y.Z 或 vX.Y.Z(非必须属性),可选后缀 -dev、-patch、-alpha、-beta 或 -RC
        "authors": [                                                    //作者信息 (非必须属性)
            {
                "name": "caoyunmeng",
                "email": "yunmengcao@gmail.com",
                "homepage": "https://www.example.com",
                "role":"Developer"
            }
        ],
        "type": "project",                                          //包的类型(非必须属性)
        "homepage":"https://github.com/",                            //包的源码地址(非必须属性)
        "readme":"",                                                //表示README 文档的绝对路径(非必须属性)
        "time":"2020-11-23",                                                  //表示包的版本发布时间(非必须属性),必须符合 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS 格式
        "license": "MIT",                                               //遵循的协议(非必须属性)
        "keywords": [                                                   //表示一组用于搜索与筛选的与包相关的关键字(非必须属性)
            "Yii2",
            "widget",
            "bootstrap4",
            "adminlte3",
            "php"
        ],
        "minimum-stability": "dev",                                     //这个属性定义了按稳定性过滤包的默认值,默认为stable;可用的稳定性标识:dev、alpha、beta、RC、stable。
        "require": {                                                    //表示必须安装的依赖包列表
            "php": ">=7.3.7"
        },
        "require-dev":{                                                  //表示开发或运行测试时的依赖包列表
            "zy/ydweb":"dev-master"
        },
        "autoload": {                                                   //自动加载
            "psr-4": {                                                  //自动使用的 psr-4 格式
                "pf\\arr\\": "src/"        // key命名空间,value本地代码路径
            }
        },
        "autoload-dev": {
            "psr-4": {
                "example\\": "example"
            }
        },
        "extra":{               //表示scripts 使用的任意扩展数据
            "yii\\composer\\Installer::postCreateProject": {
                "setPermission": [
                    {
                        "runtime": "0777",
                        "web/assets": "0777",
                        "yii": "0755"
                    }
                ]
            }
        },
        "config":{
            "optimize-autoloader":"true"
        }
    }
    
    
    • 类型
    "type": "project"
    
    library: 默认类型,当前包是一个库。可以将文件复制到 vendor 目录。
    project: 当前包是一个项目,而不是一个库。
    metapackage: 包含需求并将触发其安装的空包,但不包含文件,并且不会向系统写入任何内容。因此这种安装类型并不需要一个 dist 或 source。
    composer-plugin: 一个安装类型为 composer-plugin 的包,它有一个自定义安装类型,可以为其它包提供一个 installler
    
    • 遵循的协议
     "license": "MIT"
     
     https://spdx.org/licenses/ 常见协议:
     Apache-2.0
     BSD-2-Clause
     BSD-3-Clause
     BSD-4-Clause
     GPL-2.0-only / GPL-2.0-or-later
     GPL-3.0-only / GPL-3.0-or-later
     LGPL-2.1-only / LGPL-2.1-or-later
     LGPL-3.0-only / LGPL-3.0-or-later
     MIT
    
    
    • 依赖包匹配规则
    -确定版本: 1.0.2
    -范围版本:>=1.0.2
    -连字符范围: 1.0-2.0
    -通配符: 1.0.*
    -"~":指定向后兼容的最小版本
    eg:~1.2 等同于 >=1.2.0 && <2.0.0
       ~1.2.3 等同于 >=1.2.3 && <1.3.0
    -"^":允许大版本前的所有版本
    eg:^1.2 等同于 >=1.2 && <2.0.0
        ^1.2.3 等同于 >=1.2.3 && <2.0.0
    
    • 仓库配置

    https://docs.phpcomposer.com/05-repositories.html#Using-private

    "repositories": {
        "packagist": {
            "type": "composer",   //指定仓库的类型
            "url": "https://packagist.phpcomposer.com"   //指定仓库的地址
        }
    }
    
    type的取值:
    composer,Composer包托管仓库,例如 https://packagist.phpcomposer.com;
    vcs,版本控制管理系统,例如 https://git.yidian-inc.com:8021/caoyunmeng/hubble-server.git;
    pear,PEAR上的包;
    package,位于互联网上包;
    artifact,代码zip包合集;
    path,指向代码具体位置。
    
    • config

    https://getcomposer.org/doc/06-config.md

    config配置只在项目中发挥作用,常用配置:
    缓存dist包优先
    "preferred-install":"dist"或composer install|update 添加 --prefer-dist
    优化自动加载(性能提升25%-30%)
    "optimize-autoloader":"true"或composer install -o
    使用Authoritative class maps或apcu cahe缓存空结果
    "classmap-authoritative":"true"或composer install –a --classmap-authoritative|--apcu-autoloader
    

    composer.lock

    • 当执行composer install命令之后,将会根据当前composer.json文件中指定的依赖包版本生成composer.lock文件。此后,install命令将会检查锁文件是否存在,如果存在,它将下载指定的版本(忽略composer.json文件中的定义)。如果不存在composer.lock文件,Composer将读取composer.json并创建锁文件。
    • 一般在项目中,会选择将composer.lock上传至git库,用于保证项目成员开发中所有依赖包版本保持一致。但是在库中,一般不会将composer.lock文件上传至git库,

    创建自己的composer库

    https://docs.phpcomposer.com/02-libraries.html

    • 创建自己的包结构目录
    hello-composer
            |
            |-- src    包源码
            |    |-- build  功能代码 
            |
            |-- example  一些实例
            |
            |-- README.md
            |
            |-- composer.json 下面生成
    
    • 填写包描述文件(创建composer.json文件)
    {
        "name": "test/hello-composer",
        "description": "Hello, Composer!",
        "type": "library",
        "require": {
            "php": ">=7.0"
        },
        "license": "MIT",
        "authors": [
            {
                "name": "cym",
                "email": "cym@google.com"
            }
        ],
        "minimum-stability": "stable",
        "autoload": {
            "psr-4": {
                "test\\": "src/"
            }
        }
    }
    
    • 编写类库,在vendor同级目录下创建src目录,在src目录下创建HelloComposer.php
    namespace test;
    
    class HelloComposer
    {
        public static function greet()
        {
            echo "Hello, Composer!", PHP_EOL;
        }
    }
    

    注意:

    1. 代码风格建议参考PSR-2规范:https://www.php-fig.org/psr/psr-2/,文件命名和路径规范建议参考PSR-4规范:https://www.php-fig.org/psr/psr-4/

    示例:

    完整类名命名空间前缀文件基目录文件路径
    \Acme\Log\Writer\File_WriterAcme\Log\Writer./acme-log-writer/lib/./acme-log-writer/lib/File_Writer.php
    \Aura\Web\Response\StatusAura\Web/path/to/aura-web/src//path/to/aura-web/src/Response/Status.php
    \Symfony\Core\RequestSymfony\Core./vendor/Symfony/Core/./vendor/Symfony/Core/Request.php
    \Zend\AclZend/usr/includes/Zend//usr/includes/Zend/Acl.php

    2. 文件的路径需与composer.json中autoload的值相匹配。

    • 引用自己的composer包

    新建一个exam项目,引用上文创建的包并查看效果。新建exam文件夹,创建composer.json

        {
            "name": "test/exam-hello-composer",
            "description": "Hello, Composer!",
            "type": "project",
            "license": "MIT",
            "authors": [
                {
                    "name": "cym",
                    "email": "cym@google.com"
                }
            ],
            "require": {
                "test/hello-composer": "*"
            },
            "minimum-stability": "dev",
            "repositories": {
                "local": {
                    "type": "path",
                    "url": "/path/to/hello-composer"
                }
            }
        }
    

    配置文件需要注意两点:

    1. 如果hello-composer的composer.json文件没有version字段(或不是稳定版),minimum-stability值要是dev(默认是stable),否则无法安装; 
    2. 需添加自定义仓库,type值为path。
    • 执行composer install,引入文件,会在vendor目录下自动生成test/hello-composer目录
    • 创建项目,使用引用的文件
        namespace test;
        
        require "vendor/autoload.php";
        
        use test\HelloComposer;
        
        class Test
        {
            public static main()
            {
                HelloComposer::greet();
            }
        }
        
        Test::main();
    

    发布composer包

    将Composer包发布到互联网的方式有几种:

    1. 打包成zip,上传到任意一个可公开访问的网站;
    2. 通过版本控制软件,上传到代码仓库;
    3. 提交到PEAR社区;
    4. 提交到私有的Composer仓库;
    5. 提交到Packagist。

    如果代码开源,建议提交到Packagist,方便全世界的PHP开发者检索和使用,为Composer生态做贡献。

    提交包到Packagist,要经历以下过程:
    5.1 在Github创建项目并提交代码;
    5.2 在Packagist输入项目地址提交包;
    5.3 在Github配置项目,触发Packagist自动更新。

    前两步是必须的,第三步可选。本着为提交的包负责的态度,强烈建议完成第三步操作。 提交包的过程涉及到Github和Packagist两个站点,Github和Packagist之间的关系为:Github托管实际的代码和文件;Packagist托管包的作者、包名、版本号、下载量等元数据保。简要说Packagist是索引,Github是内容提供方。

    将composer包提交至packagist

    前提条件

    1. github账号
    2. packagist账号

    创建自己的项目

    • github上创建自己的开放型仓库,然后执行git clone克隆至本地进行开发。在项目根目录下创建composer.json文件
    {
            "name": "test/exam-hello-composer",
            "description": "Hello, Composer!",
            "type": "project",
            "license": "MIT",
            "authors": [
                {
                    "name": "cym",
                    "email": "cym@google.com"
                }
            ],
            "require": {
                
            },
            "minimum-stability": "stable",
            "repositories": {
    
            }
    }
    
    • 使用composer validate验证包是否可用
    • 进行项目的开发,然后将代码提交至github
    • 对代码进行tag打包
      git tag -a v1.0.0 -m "package init""
    • 登陆packagist,点击页面右上角submit,将github项目地址复制入Repository URL(Git\svn\Hg),点击输入框下方check按钮,当检测没有问题时,chekck按钮会转变为提交按钮,点击提交即可
    • 在本地使用命令composer create-project命令拉取packgist中的框架代码至本地创建新的项目,执行命令: composer create-project yidian/yaf_demo vpn 1.0.0

    搭建私有的composer库

    https://github.com/composer/satis/tree/1.0.0

    展开全文
  • PHP composer

    2020-05-08 10:28:10
    一、composer 快速入门 1.1、composer 是什么 ① composer 是 PHP 的一个依赖管理工具 ②安装composer ③ 资源插件:解决 js、css 的依赖的:composer. global require "fxp/composer-asset- plugin:^1.2.0" ...

    一、composer 快速入门

    1.1、composer 是什么

    ① composer 是 PHP 的一个依赖管理工具

    ②安装 composer

    ③ 资源插件:解决 js、css 的依赖的:composer. global require "fxp/composer-asset- plugin:^1.2.0"

    1.2、composer、github、packagist 之间的关系

    例如:有一个 A 包,它依赖于 B、C 包

    当执行 composer require A 时,composer 首先去到 packagist(存 放A、B、C三个包的依赖关系) 查找 A 包的依赖(找到 A依赖B、C),然后再到 github(存放 A、B、C 三个包) 下载 A、B、C三个包。

    总结:packagist 是存放A、B、C三个包的依赖关系的库、github 是存放 A、B、C 三个包的库、composer 是一款下载工具

    注:composer require --prefer-dist A(--prefer-dist 强制使用压缩包)

    composer require --prefer-source A(--prefer-source 强制克隆源码)

    1.3、Packagist 镜像

    由于某些原因,github 和 packagist 在国内访问速度很慢。中国镜像定期把 github 和 packagist 的文件放在服务器,我们只需要把 仓库的路径修改为镜像的路径即可。

    有两种方式,一是修改Composer的全局配置(推荐的方式):

    composer config -g repo.packagist composer https://packagist.phpcomposer.com

    二 是修改单个项目的配置:

    composer config repo.packagist composer https://packagist.phpcomposer.com

    上述命令将会在当前项目中的 composer.json 文件的末尾自动添加镜像的配置信息( 你也可以自己手工添加):

    "repositories": {
        "packagist": {
            "type": "composer",
            "url": "https://packagist.phpcomposer.com"
        }
    }

    1.4、composer 基本命令

    composer self-update/selfupdate:更新 composer 版本
    
    composer install:根据当前目录下的 composer.json 文件来安装依赖代码库
    
    composer update:更新依赖 代码库
    
    composer create-project:创建项目
    
    composer init:交互方式在当前目录下创建 composer.json 文件

    ① composer install

    从当前目录读取 composer.json 文件,处理了依赖 关系,并把其安装到 vendor 目录下。如果当前目录下存在 composer.lock 文件,它会从此文件读取依赖版本,而不是根据 composer.json 文件去获取依赖。这确保了该 库的每个使用者都能得到相同的依赖版本。如果没有 composer.lock 文件,composer 将在处理完依赖关系后创建它。

    ② composer update

    更新所有依赖 composer update、更 新指定的包 composer update monolog/monolog

    更新指定的多个包 composer update monolog/monolog symfony/dependency-injection

    还可以通过通配符匹配包 composer update monolog/monolog symfony/*

    二、composer 进阶

    2.1、自动加载

    ①、composer 根据声明的依赖关系,从相关库的源下载代码文件。

    ②、并根据依赖关系,在 Composer 目录下生成供类自动加载的 PHP 脚本。

    ③、使用的时候,项目开始处引入 “/vendor/autoload.php” 文件,就可以直接实例化这些第三方类库中的类了。

    以monolog/monolog为例:

    $log = new Monolog\Logger('name');
    $log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
    $log->addWarning('Foo');

    我们不用关心库文件的加载问题,composer 的 autoload.php 文件已经帮我们处理好了各个库的自动加载。

    2.2、深入理解composer的autoload自动加载原理

    ①、进入 autoload.php

    require_once __DIR__ . '/composer/autoload_real.php';
    
    return ComposerAutoloaderInite2400fa8562d5b5529be6cfd7cb17ca0::getLoader();

    ②、进入 getLoader() 方法

    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }
    
        spl_autoload_register(array('ComposerAutoloaderInite2400fa8562d5b5529be6cfd7cb17ca0', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInite2400fa8562d5b5529be6cfd7cb17ca0', 'loadClassLoader'));
    
        $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\ComposerStaticInite2400fa8562d5b5529be6cfd7cb17ca0::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);
    
        if ($useStaticLoader) {
            $includeFiles = Composer\Autoload\ComposerStaticInite2400fa8562d5b5529be6cfd7cb17ca0::$files;
        } else {
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequiree2400fa8562d5b5529be6cfd7cb17ca0($fileIdentifier, $file);
        }
    
        return $loader;
    }

    可以明显看到,他将autoload_namespaces.php、autoload_psr4.php、autoload_classmap.php、autoload_files.php等几个配置文件包含了进来,并进行了相关处理(setPsr4),最后注册(register)。
    ③、那么我们跟进register方法

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

    这函数就一行,但简单明了,直接调用php自带的spl_autoload_register函数,注册处理__autoload的方法,也就是loadClass方法。

    ④、再跟进loadClass方法

    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file);
    
            return true;
        }
    }

    从函数名字就可以大概知道流程:如果存在$class对应的这个$file,则include进来。
    ⑤、那么进findFile方法里看看吧

    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }
    
        $file = $this->findFileWithExtension($class, '.php');
    
        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }
    
        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }
    
        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }
    
        return $file;
    }

    ⑥、通过类名找文件,最终锁定在findFileWithExtension方法中。

    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
    
        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath.'\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        $length = $this->prefixLengthsPsr4[$first][$search];
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
                            return $file;
                        }
                    }
                }
            }
        }
    
        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }
    
        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }
    
        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }
    
        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }
    
        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }
    
        return false;
    }

    最终实现将命名空间\类这样的类名,给转换成目录名/类名.php这样的路径,并返回完整路径。

    2.3、阐述 composer 的自动加载机制

    ①、composer 根据声明的依赖关系,从相关库的源下载代码文件。

    ②、并根据依赖关系,在 Composer 目录下生成供类自动加载的 PHP 脚本。

    ③、使用的时候,项目开始处引入 “/vendor/autoload.php” 文件,就可以直接实例化这些第三方类库中的类了。

    2.4、版本稳定性

    如果你没 有显式的指定版本的稳定性,composer会根据使用的操作符,默认在内部指定为 -dev 或者 -stable。例如:

    如果你想指定版本只要稳定版 本,你可以在版本后面添加后缀 -stable

    minimum-stability 配置项定义了包在选择版本时对稳定性的选择的默认行为。默认是 stable。

    它的值如下(按照稳定性排序)dev,alpha,beta,RC 和 stable。

    除 了修改这个配置去修改这个默认行为,我们还可以通过稳定性标识(例如 @stable 和 @dev)来安装一个相比于默认配置不同稳定性的版本。例如:

    {
        "require": {
            "monolog/monolog": "1.0.*@beta",
            "acme/foo": "@dev"
        }
    }

    2.5、其它命令

    ① remove命令:移除一个包及其依赖(在依赖没有被其他包使用的情况下)

    composer remove monolog/monolog

    ② search 命令:composer search monolog

    如果只是想 匹配名称可以使用 --only-name 选项 composer search --only-name monolog

    ③ show命令:列出项目目前所安装的包的信息

    列出所有已经安装的包 composer show、可以通过通配符进行筛选 composer show monolog/*、

    显示具体某个包的信息 composer show monolog/monolog

    2.6、版本约束

    我们可以指 定要下载的包的版本。例如我们想要下载版本 1.19 的 monolog 。我们可以通过 composer.json 文件:

    {
        "require": {
            "monolog/monolog": "1.19"
        }
    }

    然后运行 install 命令,或者通过 require 命令达到目的:composer require monolog/monolog:1.19 或者 composer require monolog/monolog=1.19 或者 composer require monolog/monolog 1.19

    ① 精确版本:可以指定具体的版本,告诉Composer只能安装这个版本。但是如果其他的依赖需要用到其他的版本,则包的安装或者更新最后会失败并终止。 例子:1.0.2

    ② 范围:使用比较操作 符你可以指定包的范围。这些操作符包括:>,>=,<,<=,!=。你可以定义多个范围,使用空格 或者逗号:表示逻辑上的与,使用双竖线||:表示逻辑上的或。需要注意的是,使用没有边界的范围有可 能会导致安装不可预知的版本,并破坏向下的兼容性。建议使用折音号操作符。例子:>=1.0 、>=1.0 <2.0 、>=1.0 <1.1 || >=1.2

    ③ 范围(使用连字符):带连字符的范围表明了包含 的版本范围,意味着肯定是有边界的。其中连字符的左边表明了 >= 的版本,而连字符的右边情况则稍微有点复杂。如果右边的版本不是完整的版本号,则会被使用通配符进行补全。例如 1.0 - 2.0 等同于 >=1.0.0 <2.1(2.0相当于2.0.*),而 1.0.0 - 2.1.0 则等同于 >=1.0.0 <=2.1.0。

    ④ 通配符:可以使用通配符去定义版本。1.0.* 相当于 >=1.0 <1.1。

    ⑤ 波浪号~:~1.2 相当于 >=1.2 <2.0.0,而 ~1.2.3 相当于 >=1.2.3 <1.3.0。对于使用 Semantic Versioning 作为版本号标准的项目来说,这种版本 约束方式很实用。例如 ~1.2 定义了最小的小版本号,然后你可以升级 2.0 以下的任何版本而不会出问题,因为按照 Semantic Versioning 的版本定义,小版本的升级不应该有兼容性的问题。简单来说,~定义了最 小的版本,并且允许版本的最后一位版本号进行升级。

    需要注意的是,如果 ~ 作用在主版本号上,例如 ~1,按照上面的说法,composer 可以安装版本 1 以后的主版本,但是事实上是 ~1 会被当作 ~1.0 对 待,只能增加小版本,不能增加主版本。

    ⑥ 折音号^:该操作符的行为跟 Semantic Versioning 有比较大的关联,它允许升级版本到安全的版本。例如,^1.2.3 相当于>=1.2.3 <2.0.0,因为在 2.0 版本前的版本应该都没有兼容性的问题。而对于 1.0 之前的版本,这种约束方式也考虑到了安全问题,例如 ^0.3 会被当作 >=0.3.0 <0.4.0 对待。

    三、composer 问题集锦

    3.1、错误一

    Warning: This development build of composer is over 30 days old. It is recommended to update it by running "C:\ProgramData\ComposerSetup\bin\composer.phar self-update" to get the latest version.

    解决方法:composer selfupdate

     

    3.2、错误二

    You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug

     

    解决方法:`composer selfupdate`

    3.3、错误三

    Fatal error: Call to undefined method Fxp\Composer\AssetPlugin\Package\Version\VersionParser::parseLinks() in C:\Documents and Settings\Administrator\Application Data\Composer\vendor\fxp\composer-asset-plugin\Repository\VcsPackageFilter.php on line 272

    解决方法:删除composer资源插件,再重新安装

    删除——rm -r %APPDATA%\Composer\vendor\fxp

    安装——composer global require "fxp/composer-asset-plugin:~1.0.3"

    3.4、错误四

    The "yiisoft/yii2-composer" plugin requires composer-plugin-api 1.0.0, this *WIL L* break in the future and it should be fixed ASAP (require ^1.0 for example). The "fxp/composer-asset-plugin" plugin requires composer-plugin-api 1.0.0, this*WILL* break in the future and it should be fixed ASAP (require ^1.0 for example ).

    解决办法:Yii2 需要 composer-plugin-api 1.0 以上的版本,运行以下命令:

    composer global require "fxp/composer-asset-plugin:~1.1.1"

    3.5、报 [ErrorException] zlib_decode(): data error 错

    解决办法:执行 composer self-update 即可

    3.6、在执行迁移或者数据填充时发生「class not found」错误

    解决办法:试着先执行 composer dump-autoload 命令后再进行一次。

    3.7、提示以下类似的错误时

    Problem 1
        - The requested package graham-campbell/credentials ~1.0 is satisfiable by g
    raham-campbell/credentials[1.0.x-dev] but these conflict with your requirements
    or minimum-stability.

    解决方法:在composer.json中添加以下(如果存在则修改)

    "minimum-stability": "dev",

    3.8、如果不需要使用https,可以这么写,以解决有时候因为 https 造成的问题:

    composer config -g secure-http false

    3.9、composer update 或者 composer install提示killed解决办法

    出现此原因大多因为缓存不足造成,在linux环境可增加缓存解决。

    free -m
    mkdir -p /var/_swap_
    cd /var/_swap_
    #Here, 1M * 2000 ~= 2GB of swap memory
    dd if=/dev/zero of=swapfile bs=1M count=2000
    mkswap swapfile
    swapon swapfile
    echo “/var/_swap_/swapfile none swap sw 0 0” >> /etc/fstab
    #cat /proc/meminfo
    free -m

    四、composer 的自动加载方式(psr-0、psr-4、class-map、files)

     

    4.1、composer 的五套 PHP 非官方规范

    • PSR-0 (Autoloading Standard) 自动加载标准

    • PSR-1 (Basic Coding Standard) 基础编码标准

    • PSR-2 (Coding Style Guide) 编码风格向导

    • PSR-3 (Logger Interface) 日志接口

    • PSR-4 (Improved Autoloading) 自动加载优化标准

    4.2、composer 的自动加载

    对于第三方包的自动加载,Composer提供了四种方式的支持:

    PSR-0 、PSR-4 的自动加载,生成class-map,和直接包含files 的方式。

    ①、PSR-4 方式

    该方式是 composer 推荐使用的一种方式,因为它更易使用并能带来更简洁的目录结构。在 composer.json 里是这样进行配置的:

    {
        "autoload": {
            "psr-4": {
                "Foo\\": "src/",
            }
        }
    }

    key 和 value 就定义出了 namespace 以及到相应 path 的映射。按照 PSR-4 的规则,当试图自动加载 “Foo\Bar\Baz” 这个 class时,会去寻找 “src/Bar/Baz.php” 这个文件,如果它存在则进行加载。

    注意, “Foo\”并没有出现在文件路径中,这是与 PSR-0 不同的一点,如果 PSR-0 有此配置,那么会去寻找 ”src/Foo/Bar/Baz.php” 这个文件。另外注意 PSR-4 和 PSR-0 的配置里,”Foo\” 结尾的命名空间分隔符必须加上并且进行转义,以防出现 ”Foo” 匹配到了 ”FooBar” 这样的意外发生。在 composer 安装或更新完之后,psr-4 的配置换被转换成 namespace 为 key,dir path 为 value 的Map 的形式,并写入生成的 vendor/composer/autoload_psr4.php 文件之中。

    ②、PSR-0方式

    {
        "autoload": {
            "psr-0": {
                "Foo\\": "src/",
            }
        }
    }

    这个配置也以 Map 的形式写入生成的 vendor/composer/autoload_namespaces.php 文件之中。

    ③、Class-map 方式

    通过配置指定的目录或文件,然后在 Composer 安装或更新时,它会扫描指定目录下以 .php 或 .inc 结尾的文件中的class,生成class 到指定 file path 的映射,并加入新生成的 vendor/composer/autoload_classmap.php 文件中(前提是目录和文件已经存在,否则 composer 在扫描时会报错)

    {
        "autoload": {
            "classmap": ["src/", "lib/", "Something.php"]
        }
    }

    例如 src/ 下有一个 BaseController 类,那么在 autoload_classmap.php 文件中,就会生成这样的配置:

    'BaseController' => $baseDir . '/src/BaseController.php'

    ④、Files方式

    就是手动指定供直接加载的文件。比如说我们有一系列全局的 helper functions,可以放到一个 helper 文件里然后直接进行加载

    {
        "autoload": {
            "files": ["src/MyLibrary/functions.php"]
        }
    }

    它会生成一个 array,包含这些配置中指定的 files,再写入新生成的 vendor/composer/autoload_files.php 文件中,以供autoloader 直接进行加载。

    展开全文
  • composer autoload

    2017-02-16 11:44:18
    Composer 架构 composer autoload原理
  • Composer了解

    2019-01-16 09:17:56
    一.安装安装包的下载和事项注意点百度搜索“composer”,官网下载安装包注意:必须确保php.exe路径是系统全局变量如何确保,打开命名窗口,输入php,是否可行,可行则为全局变量安装方法与成功判断...创建composer...
  • Composer架构

    2018-01-17 15:17:44
    composer.json 架构 本章将解释所有在 composer.json 中可用的字段。 JSON schema 我们有一个 res/composer-schema.json. Root 包 “root 包”是指由 composer.json 定义的在你项目根目录的包。...
  • Composer使用

    2018-03-11 00:48:04
    示例:$ composer require monolog/monolog这是在安装monolog库。$ composer create-project laravel/laravel learnlaravel5 5.0.22这是在安装laravel框架并创建项目。为什么用composer通过过composer,我们可以使用...
  • Laragon 升级composer

    2021-06-17 10:56:35
    本来我打算下载个ThinkPHP6.0 然后手册说必须用composer安装 本来我是要去下载composer 后来查询得知...大致意思是版本太旧了 于是我上网查找如何更新 composer self-update 升级完成查看结果 composer -V ...
  • composer命令行

    2017-08-06 16:17:35
    转自composer文档:...为了从命令行获得帮助信息,请运行 composer 或者 composer list 命令,然后结合 --help 命令来获得更多的帮助信息。 命令行全局参数 进程退出代码初始化 ini
  • 学会使用Composer

    2021-09-15 09:24:42
    1、composer,既然你看这篇文章,说明你已经使用或者即将使用composer。关于composer的安装环境就不再过多描述。(直接下载安装即可) 2、composer,是什么。...查找我们要使用的软件 比如, 然后,看...
  • Composer入门

    2015-10-19 10:32:12
    本文介绍Composer的入门知识
  • Composer命令行

    2019-02-11 13:20:22
    为了从命令行获得帮助信息,请运行 composer 或者 composer list 命令,然后结合 --help 命令来获得更多的帮助信息。 命令行 全局参数 进程退出代码 初始化 init - - 参数 安装 install - - 参数...
  • composer使用

    2016-04-14 17:19:50
    Composer 不是一个包管理器。是的,它涉及 “packages” 和 “libraries”,但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一...
  • composer运用

    2019-05-26 22:33:10
    composer --version :检查composer是否安装成功 composer config -l -g :查看全局配置 2.切换镜像 composer config -g repo.packagist composer https://packagist.laravel-china.org:最新的国内镜像 composer...
  • Composer 使用

    2018-06-07 11:38:33
    composer是什么: 如果你知道yum、apt-get、npm、bower等命令中的一种或者多种,那么,你也能很快知道composer是什么了。没错,它就是PHP里快速安装类库的。平时,我们安装一个PHP类库,需要搜索-&gt;下载;...
  • composer学习

    2021-02-26 17:02:57
    一,什么是composer? 是php的一个依赖管理工具,它允许你申明项目依赖的代码库,它会为你在项目中安装它们。 二,安装 composer官网https://www.phpcomposer.com/ 阿里云composerhttps://developer.aliyun....
  • composer介绍

    2017-06-26 22:07:35
    Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个...
  • Composer介绍

    2020-11-03 16:48:25
    Composer不是与Yum或Apt相同的软件包管理器。它处理“程序包”或库,但它基于每个项目进行管理,将它们安装在项目的vendor目录中。默认情况下,不会全局安装任何内容。为了方便起见,也能通过全局命令支持“全局”...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,512
精华内容 1,804
关键字:

composer查找