php第三方包管理

Author Avatar
Erien 5月 12, 2019

前言#

在编写程序的时候,我们会用到别人的第三方包,俗称轮子。如何正确引入一个第三方的包,且正确合理的放置,是一个值得规范的事情。

传统的包引入#

include "the/path/of/file.php";
require "the/path/of/file.php";
include_once "the/path/of/file.php";
require_once "the/path/of/file.php";

function_name();
?>

优点:我们比较熟悉包内结构,文件位置

缺点:我们必须清楚文件结构;引入大量的inlude,require语句;不能实现懒加载

新的包引入方式#

__autoload()魔术方法:当运行时调用了当前没有声明过的类时,自动运行该函数。

<?php

function __autoload($class_name){
    require "./new_package/class2.php";
}

(new hello())->sayHello();

我们可以在我们文件中重新定义这个函数,并添加我们函数中的逻辑去实现文件的加载,这种方式属于懒加载,一定程度上能节省资源。


__autoload()函数必须传入参数(尽管我们也许不会使用)

在原本autoload中,同一个文件中只能支持同时存在一个autoload函数,重复定义会引起panic。

autoload的改良#

在php5.5后,引入了spl改良版的autoload系列函数,使用spl_autoload_register或者set_include_pathspl_autoload的组合可以很快引入某路径下的类。

<?php
//
//spl_autoload_register(function ($class_name){
//   if ($class_name === 'hello'){
//       include "./new_package/class2.php";
//   }
//});

set_include_path("./new_package/"); //这里需要将路径放入include
spl_autoload("class2");

(new hello())->sayHello();

优点:懒加载,重新定义/抽象了require和include

缺点:仍无法解决大量的引入代码问题;可能产生循环引用

包管理工具Composer#

composer是php项目中的一个开源第三方包管理工具,是一个让人眼前一亮的工具,它将autoload的思想发挥到了新的层次。

一个使用composer来管理第三方包的项目通常会在项目根目录下包含vender文件夹,里面放有我们的第三方包。

composer使用方法:

composer init//初始化一个目录成为composer管理项目
composer require "xxxxx@1.0.*"

//如果已经存在别人的composer.json文件
composer install
//升级版本
composer update
//删除
composer remove "xxxx"

composer通过生成一个总的引入类来引入所有的第三方依赖,我们只需要在整个项目的一个地方引入require "./vender/autoload.php";这样一个文件,就会去自动执行整个需要文件的执行。

composer.json中的autoloadautoload_dev说明了整个项目中的依赖关系的命名关系

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },

我们可以直接使用\App\Hello来代表在app目录下的Hello类,composer会自动实现命名空间到文件目录的转换。

这篇博客中有更详细的命名映射方法。

composer引入的版本号#

表达式 意义 实例 含义
数字 指定版本 1.2.3 下载1.2.3版本
~符号 维持小版本 ~1.2.3 下载1.3.0前的版本
^符号 维持大版本 ^1.2.3 下载2.0.0前的版本
*符号 任意版本 1.2.* 下载1.2中任意一个版本
运算符 运算符含义 >=1.2.3 下载大于1.2.3的版本
@符号 选择分支 1.2.3@dev 下载dev分支中的1.2.3版本

多个条件支持,和|分割,代表and or逻辑运算,如composer require xxx ^1.2.0@dev,!=1.2.3

注意#

不要随意改动composer.lock文件中的内容

注意将vender文件夹从版本控制中去除