使用php composer时, 如何优雅修改vendor中第三方代码

有些时候在某一个项目中, 使用了一个第三方包, 但是会发现某一些地方不符合项目需求. 或者需要在包代码里注入一段自己的逻辑. 我们可以选择自己维护一个分支, 或者干脆改vendor文件夹, 并它他加入代码管理. 但对于要修改少量代码时, 这样做貌似不太'优雅'

请先查阅函数spl_autoload_register文档

其实composer也是利用这个函数来实现自动加载的.

php代码执行时, 如果遇到代码里依赖了一个类, 而这个类在当前进程中不存在时, php 会按照加载器队列顺序调用通过spl_autoload_register函数注册过的类加载器. 直到某个加载器执行完后, 这个被依赖的类被加载进当前进程空间, 或者所有加载器都执行完这个类仍不存在, 并抛出类不存在的异常.

所以我们也可以利用spl_autoload_register函数, 注册一个加载器, 并使其在队列里位于composer加载器之前. 当php需要加载我们要改动的第三方代码包里的类时, 我们加载自己改好的php文件, 而不是vendor包里的php文件. 这样就达到了覆盖的目的.

煮个栗子:
我写了一个自动抢饿了么最大外卖红包swoole程序. 大概流程就是, 利用hanson/vbot 包监听微信群里发送的红包链接, 并把链接推送到红包队列, 然后有个进程使用小号轮训饿了么接口, 等红包的下一个就是最大时, 用大号去领, 就领到了, 但是有个问题:
vbot 包有个message handler类, 里面有个listen方法. 这个方法里会调用微信网页版的接口. 当收到微信消息时会调用用户的消息处理器, 并且此方法是while(true)循环.所以一旦执行listen方法, 整个进程是会阻塞在这个方法里的, 就算用swoole的异步定时器也无力回天. 但是我又有个需求, 就是异步发送消息: 当某个红包的最大红包来临时, 可以配置不自动抢, 而是把链接转发到一个'内部群', 由群员抢最大红包. 所以我只好修改一下这个类了, 把while(true)循环改成swoole的定时器

左边是修改后的

项目目录结构
项目目录结构

注意到, overwrite文件夹, 就是我用来放覆盖第三方代码php文件的目录
里面的autoload.php文件内容:


<?php

spl_autoload_register(function ($cls) {
    $map = [
        'Hanson\Vbot\Core\MessageHandler' => __DIR__ . '/MessageHandler.php',
        'Hanson\Vbot\Core\Server' => __DIR__  . '/Server.php',
    ];

    if (isset($map[$cls])) {
        echo $cls . ' loaded' . PHP_EOL;
        include $map[$cls];
        return true;
    }
// 注意需要设置prepend参数为true
}, true, true);

项目的composer.json加载了这autoload.php:

{
  "require": {
    "hanson/vbot": "^2.0",
    "symfony/debug": "^4.1"
  },
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    },
    "files": ["src/overwrite/autoload.php"]
  }
}

请自行体会

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 11月的天气,本该是凉爽至极的秋,甚至是开始准备入冬了。然而,我住的城市,现在还是一片盎然碧绿和闷热。稍...
    乾坤大royi阅读 418评论 0 0
  • 《临江仙》“北京工程局一公司供暖现状” 只有白班供暖,最冷无人添火;哗哗水响依旧。十一点撤水,关火封炉歇。朝九晚五...
    洋州客阅读 192评论 0 0
  • 2009年11月12日 这段时间我在课堂上“废话”比较多。所谓的“废话”,我以为便是和课文中某个内容甚至某...
    明月劫阅读 670评论 0 1
  • 《海底两万里》写于1870年,这本名著是凡尔纳叙述法国生物学家阿龙纳斯在海洋旅行的所见所闻! 这事发生在1866年...
    c312c734136c阅读 695评论 0 0
  • 有时候觉得迷茫,好像不知道要什么,但我清晰的知道自己不要什么样的生活,心里本能的排斥。不喜欢“圆滑”这个词,好像我...
    晴栀菀歌_296b阅读 394评论 0 0