PHP 如何引入第三方类库

2016-06-24 09:27:35 +08:00
 lml12377

问题是这样的:

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

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

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

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

这问题大概类似“ nodejs 如何引入第三方类库,我不想用 npm ” “ centos 如何安装软件包,我不想用 yum/rpm ”
chaegumi
2016-06-24 10:08:39 +08:00
也不要深究什么原理啊, namespace 啊,只要引入 composer 生成的那个 autoload.php,以后所有的升级新包或者加入新包,都是 composer update 就搞定了
suikator
2016-06-24 10:15:12 +08:00
请以此为契机,使用 composer
feiyuanqiu
2016-06-24 10:17:46 +08:00
@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
2016-06-24 10:33:39 +08:00
@mcfog 我偏要 configure & make install ... 以前老师告诉我 “好学的孩子要多问为什么” ... (/= _ =)/~┴┴
lml12377
2016-06-24 10:38:16 +08:00
@feiyuanqiu 版本 5.2.16 的,发现 PHPMailerAutoload 里面它自己是注册了 autoload 的,我试一下!
mudone
2016-06-24 10:43:11 +08:00
如果不想用 composer 的远程包,可以用 composer 来管理本地的类库的嘛。
lml12377
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
2016-06-24 16:28:16 +08:00
我的天终于看见有人问 PHP 的问题了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/287958

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX