musicode / test

test
14 stars 1 forks source link

[PHP] Composer #10

Open musicode opened 9 years ago

musicode commented 9 years ago

先推荐三个网址,基本知识我懒的说了:

简单的说,composer 是管理依赖的工具,依赖的包统一放在 root/vender 目录下,所以通常框架的目录结构是这样的:

root
  |- app                 // php 文件
  |- public              // 前端静态资源
  |- vendor              // 依赖的第三方库
       |- composer
       |- autoload.php
  |- composer.json       // composer 配置文件,类似 nodejs 的 package.json

vendor 目录下有一个 autoload.php,这是 composer 的入口文件,所以需要在项目初始化时 require 它。

项目初始化

进入项目根目录,执行 composer init,会开始一段交互式命令,你需要填入包名称(格式为 vendor/name)、描述、作者、依赖的包等信息,填完之后会自动在根目录下生成一个 composer.json 文件。

说明一下,每个项目都可以认为是一个包,包可以依赖于其他包,在这个开源的世界,总是会用到业界的良心包。

当你的项目写的足够通用时,可以发布到 packagist,这样别人也能用了。

这里我们使用 lavarel 框架,因此需要在 composer.json 加入以下配置:

"require": {
    "laravel/framework": "4.2.*"
}

配好依赖之后,执行 composer install,这个过程比较漫长,尤其对国内来说(因为有墙)。

最好配置一个国内镜像,目前发现有如下两个,一个不行就换另一个:

composer install 耗时比较长,一定要有心理准备,不要出现一点小错就中断它,等它自己结束。

vendor 目录结构

执行完 composer install 之后,项目根目录下会自动创建 vendor 目录。

vendor
  |- composer
      |- ClassLoader.php
      |- autoload_classmap.php
      |- autoload_namespaces.php
      |- autoload_psr4.php
      |- autoload_real.php
  |- autoload.php

当没有其他第三方依赖时,就是这样的目录结构。如果安装了其他依赖,vendor 目录下会出现相应的文件夹。

下面详细讲解 composer 的加载机制。

Composer 加载机制

Composer 利用 PSR-0 和 PSR-4 以及 PHP5.3 的命名空间构造了一个繁荣的 PHP 生态系统。

Composer 核心方法是 composer/ClassLoader.php 的 findFile(),它的查找顺序是如下:

  1. class map
  2. PSR-4 & fallback directories
  3. PSR-0 & fallback directories
  4. include path

    class map

class map 是一个 完全限定类名 -> 文件路径 的映射表。Composer 首先从 class map 中查找类,如果找不到,才会通过 PSR-4 和 PSR-0 查找,所以它的设计初衷应该有两个:

  1. 配置一些最常使用的类,便于加速
  2. 配置一些闲散的,无规律的(与目录结构无关)类,便于规范

    PSR-x & fallback directories

前一章提过 namespace prefix,它会映射到一个或多个目录。

PSR-0 和 PSR-4 关于这部分有细微的不同。如下:

  1. PSR-4 要求 namespace prefix 必须以 \ 结尾
  2. PSR-0 要求完全限定类名必须完全匹配文件路径,PSR-4 只要求 namespace prefix 后面的部分完全匹配文件路径

如 com/baidu/Search.php,假设 namespace prefix 是 com\baidu\

Composer 为此提供了两个配置文件:

fallback directories 作为 PSR-x 的补充存在。PSR-4 和 PSR-0 各有一个对应的目录数组,当对应的 PSR-x 没有找到时,会从 fallback directories 中进行查找。

include path

通过 composer/include_paths.php 配置路径,Composer 初始化时会通过 set_include_path 把它加入到 include path 的开始位置(优先查找)。