普通的命名空间自动加载后,又对框架不熟,在M层或者C层想include直接调用第三方类时通常都不行会报错。原因是有命名空间和自动加载这两个php特性制约。
要解决这两个问题就只要两步即可,但当然在正规项目中不建议使用,要遵循MVC和PCR-0(1.只有一个入口文件;2.在类文件中不能使用直接实现方法的写法;3.命名空间与绝对路径一致)法则,这只是一个偏门技巧。
解决方法
在include文件后,用spl_autoload_unregister()把自动加载的函数注销掉;
如:spl_autoload_unregister('\\Test\\Loader::autoload');
但在运用完第三方类的时候要马上把之前的自动加载函数运行一次,不然其他方法加载不了会报错。
\main\Test1::test();
spl_autoload_register('\\Test\\Loader::autoload');
2. 第三方类要加上单独的命名空间,不然在使用的时候会,include类会以当前的命名空间来使用。如果加载类不是在跟当前命名空间同一个目录,就会报错。
贴其中一个类代码:
namespace Test;
class Factory
{
public static function createDatabase()
{
$db = new Database();
Register::set('db1',$db);
include BASEDIR.'/Test1.php';
spl_autoload_unregister('\\Test\\Loader::autoload');
\main\Test1::test();
spl_autoload_register('\\Test\\Loader::autoload');
return $db;
}
}
最终还是叮嘱不建议程序用这个,尽量遵守面向过程的编程方法。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。