《从记事本到Composer:一个PHPer的依赖管理进化史》

楔子:2003年的某个深夜,我对着屏幕上的“Fatal error: Class not found”发呆

2003年,甘肃兰州街道上盗版光盘摊位上还飘着《传奇》点卡的味道,我在一台装着windows xp的“大屁股”显示器前,用记事本敲下了人生第一行php代码:

include("conn.php");  
include("functions.php");  
// 然后...又手动加了17个include

那年PHP5.1刚发布,OOP还是个需要勇气触碰的“高级玩具”,而依赖管理?不过是在代码开头堆砌几十个include的体力活。

第一章 刀耕火种:当“依赖”还只是动词

关键词:记事本战争、include瀑布流、物理路径玄学

依赖即路径

我的第一个文章系统项目有32个php文件,每个文件开头都有一串神秘代码:

include($_SERVER[\'DOCUMENT_ROOT\'].\'/../libs/mysql_tool.php\');  
include(dirname(__FILE__).\'/../../config/settings.inc\');

为了确保不同服务器的路径兼容性,我甚至发明了“三级目录回溯法”(后来发现这玩意比量子力学还难维护)。

版本控制?不,是FTP覆盖艺术

当需要更新某个“通用函数库”时,我会:

用EMEditor打开20个相关文件

CTRL+H批量替换旧函数名

用FlashFXP覆盖服务器文件

祈祷没有同事同时修改代码

某次误删了一个分号,导致整个项目瘫痪——那是我第一次通宵看服务器日志。

第二章 青铜时代:PEAR带来的虚假繁荣

关键词:pear install、魔法通道、新坑置换旧坑

2005年,我终于在《PHPer》杂志上看到pear的介绍,仿佛找到了救世主:

pear install HTTP_Request

但现实很快给我上了一课:

依赖冲突版《罗生门》

装个mail模块需要PHP4.3+,而Image_Graph要求PHP5.0.2,但生产环境还跑在PHP4.3...

PEAR式哲学”的荒诞

为了用PEAR::DB连接MYSQL,代码膨胀了三倍,最后发现直接写mysql_query()反而更快。

最难忘的是某次给客户演示时,PEAR的自动更新把整个环境搞崩了——那天我学会了用“服务器被黑客攻击”当借口。

第三章 蒸汽革命:Composer与PSR的救赎

关键词:composer.json、命名空间、现代PHP圣杯

2012年,当我在GitHub上看到Composer时,内心是怀疑的:“这玩意能比我的祖传include大法好?”

第一次comper require的震撼教育:

composer require monolog/monolog

看着vendor目录自动生成,命名空间像地铁线路图般展开,我突然理解了什么叫做“文明的降维打击”。

PSR规范:PHPer的巴别塔

当我的自制框架第一次通过PSR-4加载器识别到Symfony组件时,仿佛看见洪水中驶来的诺亚方舟。


依赖管理的“相对论”

用^7.3定义PHP版本的那一刻,终于不用再写:

if (version_compare(PHP_VERSION, \'5.3.0\') < 0) {  
    die("请升级到PHP5.3,别再用XP了!");  
}

终章:当我们谈论依赖时,我们在谈论什么

今天,当我用我自己的ZHMVC框架部署新项目时,常会想起2003年那个在include地狱挣扎的年轻人。

从物理路径到抽象约束的进化,本质是开发者心智的升级

依赖管理史=PHP社区协作史:从个人英雄主义到全球开源共同体

终极悖论:我们创造工具管理依赖,最终却依赖了工具

后记

如果你也曾在Smarty模板里写过{include file="header.tpl"},在php.ini里调过include_path,在Composer出现前手动下载过任何组件——请在评论区用“// TODO: 此处应有掌声”接头。

毕竟,我们这一代PHPer的宿命,就是一边用着最潮的各种框架,一边在深夜怀念那段用记事本征服世界的时光。