composer理解,及自动加载的一些方法和思路

时间:2023-01-29 17:54:04

composer:是用来管理依赖的。

1、长久以来,PHP的开源方式都是项目级的,就是说我一开源就是一个项目,比如一整套的CMS,一个框架,如Codeigniter。为啥呢?其中一个很重要的原因是你不好拆开来,如果拆开来的话,没有一个有效的管理工具组合起来,导致拆开的小模块大家无人问津。

然后Composer就出现了,它负责去管理大家开源的各个小模块,有效的整合到一起,使之成为一个完整的项目。

比如说 Laravel 实际上就是由好多的小模块组成的,比如说实现路由模块是由symfony/routing完成的;比如说记日志是由 monolog/monolog 实现的。

当你用 composer 安装 laravel 的时候,composer 会自动检测所需依赖并下载

2、composer 是一个PHP代码依赖管理工具之一
比方说你的项目需要用到PHPmail这个类库,只要按照composer的格式,composer
就能自动帮你拉下这个代码库到你项目中.

3、我的理解:
管理依赖,需要什么组件的时候,使用composer require - 来下载,将在需要的项目目录下自动创建一个vender的目录(每个项目都会生成vender文件夹和两个文件composer.json和composer.lock),里面放置需要的所有组件,该项目如果需要用到这些组件的话,在入口文件中包含上vender的autoload.php自动加载文件

  require_once(__DIR__ . '/vender/autoload.php');

这样的话,有这个自动加载文件,就可以在项目中随意new组件。所以composer的作用就是管理某个项目所用到的所有组件,将其整合起来方便使用。

自动加载 

如果是组件的话,都会放在vender目录下,所包含的autoload.php会处理,但是如果要自动加载自己项目中的文件的话,方法一是写一个自己的自动加载文件,方法二是在配置文件composer.json改写

 1 {
 2     "require": {
 3         "kiddyu/beanbun": "^1.0",
 4         "symfony/finder": "^4.1",
 5         "symfony/dom-crawler": "^4.1"
 6     },
 7     "repositories": {
 8         "packagist": {
 9             "type": "composer",
10             "url": "https://packagist.phpcomposer.com"
11         }
12     },
13     "autoload": {
14         "psr-4": {"Ybean\\": "src"}//意思为定义的Ybean命名空间从目录src下取
15     },
16     "require-dev": {
17     }
18 }

另外一个配置文件composer.json可供参考

 1 {
 2     "name": "itititi/tplapidoc",
 3     "description": "基于自定义模板,生成你想要的api文档。简单易用且具备可拓展性。",
 4     "keywords": ["php", "tplapidoc", "api", "doc"],
 5     "type": "library",
 6     "license": "MIT",
 7     "authors": [
 8         {
 9             "name": "peng.yu",
10             "email": "peng.yu@qjfu.cn",
11             "homepage": "https://github.com/itititi",
12             "role": "Developer"
13         }
14     ],
15     "bin": [
16         "bin/tplapidoc"
17     ],
18     "autoload": {
19         "psr-4": {"TplApidoc\\": "src/"}
20     },
21     "prefer-stable": true,
22     "require": {
23     },
24     "require-dev": {
25         "phpunit/phpunit": "@stable" 
26     },
27     "scripts": {
28         "test": [
29             "phpunit --colors=always"
30         ]
31     }
32 }

所以重要的一行配置即为:

1 "autoload": {
2         "psr-4": {"Ybean\\": "src"}//意思为定义的Ybean命名空间从目录src下取
3  },

 有一个思路很牛的入口文件./bin/spider

 1 #!/usr/bin/env php
 2 <?php
 3 $autoload = array_reduce(range(1, 3), function($d, $v) {
 4     //$d[] = __DIR__ . '/'.str_repeat('../', $v).'autoload.php';
 5     return $d;
 6 }, [__DIR__.'/../vendor/autoload.php']);
 7 
 8 foreach($autoload as $file) {
 9     if (file_exists($file)) {
10         define('PHPUNIT_COMPOSER_INSTALL', $file);
11         break;
12     }
13 }
14 
15 unset($file);
16 
17 if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
18     fwrite(
19         STDERR,
20         'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL .
21         '    composer install' . PHP_EOL . PHP_EOL .
22         'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL
23     );
24     die(1);
25 }
26 
27 include PHPUNIT_COMPOSER_INSTALL;
28 
29 $ybean = new \Ybean\index();

有第一行的#!usr/bin/evn php,这样的话就可以直接这样这行./bin/spider 他会识别直接用PHP来执行