楔子: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的宿命,就是一边用着最潮的各种框架,一边在深夜怀念那段用记事本征服世界的时光。