V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lml12377
V2EX  ›  程序员

PHP 如何引入第三方类库

  •  
  •   lml12377 · 2016-06-24 09:27:35 +08:00 · 5738 次点击
    这是一个创建于 2879 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题是这样的:

    我的项目有入口文件,包含了启动文件 bootstrap.php ,启动文件中定义了 PSR-4 的自动加载,项目里所有类都有 namespace 。

    但是当我引入 phpMailer 的时候, phpMailer 并没有命名空间,并且它也注册了自己的 spl_autoload_register ,这个时候我在路由前定义了一个方法,里面 require PHPMailerAutoload.php ,但是却没办法使用它的类,因为会被我自己的 autoload 拦截掉( is_file 判断存在性)

    该怎么解决在命名空间存在的情况下,第三方类库引入的问题,真真不想用 composer ,请大神指路!

    15 条回复    2016-06-24 16:28:16 +08:00
    chaegumi
        1
    chaegumi  
       2016-06-24 09:37:25 +08:00   ❤️ 1
    composer 很好用,你最好使用 composer 的时候,都从 https://packagist.org/中找类库,都有的
    mahone3297
        2
    mahone3297  
       2016-06-24 09:38:11 +08:00   ❤️ 1
    composer 就是用来解决这个问题的,你不用?
    feiyuanqiu
        3
    feiyuanqiu  
       2016-06-24 09:39:23 +08:00 via iPhone   ❤️ 1
    spl 的 autoloader 不会被覆盖的,上一个 loader 找不到文件会继续调下一个注册的 loader 去找
    你看看调用 phpmailer 的时候有没有加上 root namespace ,比如这样
    $mailer = new \PHPMailer()
    tabris17
        4
    tabris17  
       2016-06-24 09:39:27 +08:00   ❤️ 1
    你用 PSR-4 的规范去 autoload 不遵循该规范的类库当然不行啦。
    别用第三方的 autoload 。自己写个通用的 autoloader ,可以 registerClass 的
    lml12377
        5
    lml12377  
    OP
       2016-06-24 09:50:04 +08:00
    @chaegumi 去网站上看了一个 mailer-bundle 的库,发现它自己是加好了 namespace 的,意思 composer 自己把别人的类库拿过来,自己处理好命名空间,再把这个包共享出去?如果我要不依赖 composer 解决这个问题,是不是也要像它这样处理?
    lml12377
        6
    lml12377  
    OP
       2016-06-24 09:52:36 +08:00
    @feiyuanqiu 好的,我自己注册的 autoload 里面 is_file 判断了文件的存在性,自己 exit 掉了。。。是不是这样:存在的话 require ,不存在的话不处理,等待第三方类库注册的 autoload 处理?
    mcfog
        7
    mcfog  
       2016-06-24 10:05:17 +08:00   ❤️ 1
    需要解决的问题其实是“不想用 composer ”这事……

    这问题大概类似“ nodejs 如何引入第三方类库,我不想用 npm ” “ centos 如何安装软件包,我不想用 yum/rpm ”
    chaegumi
        8
    chaegumi  
       2016-06-24 10:08:39 +08:00   ❤️ 1
    也不要深究什么原理啊, namespace 啊,只要引入 composer 生成的那个 autoload.php,以后所有的升级新包或者加入新包,都是 composer update 就搞定了
    suikator
        9
    suikator  
       2016-06-24 10:15:12 +08:00 via Android   ❤️ 1
    请以此为契机,使用 composer
    feiyuanqiu
        10
    feiyuanqiu  
       2016-06-24 10:17:46 +08:00   ❤️ 1
    @lml12377
    你不用在 loader 里面 exit 的, spl_autoload_register 注册的 loader 会在某个 loader include/require 文件的时候停止对队列之后的 loader 的调用,不需要自己去处理,所有 loader 都找不到文件的时候会抛一个 fatal error

    另外你用的 phpmailer 是什么版本呢,刚才去找了下,如果用的是现在 github 上面的那个版本
    可以在你的 bootstrap.php 里面 inlcude PHPMailer/PHPMailerAutoload.php 这个文件,然后注册 loader ,就行了

    require __DIR__ . '/PHPMailer/PHPMailerAutoload.php';
    spl_autoload_register('PHPMailerAutoload');
    $a = new PHPMailer();
    lml12377
        11
    lml12377  
    OP
       2016-06-24 10:33:39 +08:00
    @mcfog 我偏要 configure & make install ... 以前老师告诉我 “好学的孩子要多问为什么” ... (/= _ =)/~┴┴
    lml12377
        12
    lml12377  
    OP
       2016-06-24 10:38:16 +08:00
    @feiyuanqiu 版本 5.2.16 的,发现 PHPMailerAutoload 里面它自己是注册了 autoload 的,我试一下!
    mudone
        13
    mudone  
       2016-06-24 10:43:11 +08:00   ❤️ 1
    如果不想用 composer 的远程包,可以用 composer 来管理本地的类库的嘛。
    lml12377
        14
    lml12377  
    OP
       2016-06-24 11:04:56 +08:00
    直接把 class.phpmailer.php 、 class.phpmaileroauth.php 、 class.phpmaileroauthgoogle.php 、 class.pop3.php 、 class.smtp.php 拷了出来,新建文件夹,改名为 PHPMailer.php 、 PHPMailerOAuth.php 、 PHPMailerOAuthGoogle.php 、 POP3.php 、 SMTP.php ,每个类补上 namespace ,可用!
    yao978318542
        15
    yao978318542  
       2016-06-24 16:28:16 +08:00   ❤️ 1
    我的天终于看见有人问 PHP 的问题了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2770 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 02:37 · PVG 10:37 · LAX 19:37 · JFK 22:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.