问题是这样的:
我的项目有入口文件,包含了启动文件 bootstrap.php ,启动文件中定义了 PSR-4 的自动加载,项目里所有类都有 namespace 。
但是当我引入 phpMailer 的时候, phpMailer 并没有命名空间,并且它也注册了自己的 spl_autoload_register ,这个时候我在路由前定义了一个方法,里面 require PHPMailerAutoload.php ,但是却没办法使用它的类,因为会被我自己的 autoload 拦截掉( is_file 判断存在性)
该怎么解决在命名空间存在的情况下,第三方类库引入的问题,真真不想用 composer ,请大神指路!
1
chaegumi 2016-06-24 09:37:25 +08:00 1
composer 很好用,你最好使用 composer 的时候,都从 https://packagist.org/中找类库,都有的
|
2
mahone3297 2016-06-24 09:38:11 +08:00 1
composer 就是用来解决这个问题的,你不用?
|
3
feiyuanqiu 2016-06-24 09:39:23 +08:00 via iPhone 1
spl 的 autoloader 不会被覆盖的,上一个 loader 找不到文件会继续调下一个注册的 loader 去找
你看看调用 phpmailer 的时候有没有加上 root namespace ,比如这样 $mailer = new \PHPMailer() |
4
tabris17 2016-06-24 09:39:27 +08:00 1
你用 PSR-4 的规范去 autoload 不遵循该规范的类库当然不行啦。
别用第三方的 autoload 。自己写个通用的 autoloader ,可以 registerClass 的 |
5
lml12377 OP @chaegumi 去网站上看了一个 mailer-bundle 的库,发现它自己是加好了 namespace 的,意思 composer 自己把别人的类库拿过来,自己处理好命名空间,再把这个包共享出去?如果我要不依赖 composer 解决这个问题,是不是也要像它这样处理?
|
6
lml12377 OP @feiyuanqiu 好的,我自己注册的 autoload 里面 is_file 判断了文件的存在性,自己 exit 掉了。。。是不是这样:存在的话 require ,不存在的话不处理,等待第三方类库注册的 autoload 处理?
|
7
mcfog 2016-06-24 10:05:17 +08:00 1
需要解决的问题其实是“不想用 composer ”这事……
这问题大概类似“ nodejs 如何引入第三方类库,我不想用 npm ” “ centos 如何安装软件包,我不想用 yum/rpm ” |
8
chaegumi 2016-06-24 10:08:39 +08:00 1
也不要深究什么原理啊, namespace 啊,只要引入 composer 生成的那个 autoload.php,以后所有的升级新包或者加入新包,都是 composer update 就搞定了
|
9
suikator 2016-06-24 10:15:12 +08:00 via Android 1
请以此为契机,使用 composer
|
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(); |
11
lml12377 OP @mcfog 我偏要 configure & make install ... 以前老师告诉我 “好学的孩子要多问为什么” ... (/= _ =)/~┴┴
|
12
lml12377 OP @feiyuanqiu 版本 5.2.16 的,发现 PHPMailerAutoload 里面它自己是注册了 autoload 的,我试一下!
|
13
mudone 2016-06-24 10:43:11 +08:00 1
如果不想用 composer 的远程包,可以用 composer 来管理本地的类库的嘛。
|
14
lml12377 OP 直接把 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 ,可用!
|
15
yao978318542 2016-06-24 16:28:16 +08:00 1
我的天终于看见有人问 PHP 的问题了!
|