在Zend Framework 2或3中,模块名称可以与类名相同吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Zend Framework 2或3中,模块名称可以与类名相同吗?相关的知识,希望对你有一定的参考价值。
我们想为我们的项目Memcached
创建一个模块。这样我们就可以使用php安装的MemcachedServiceGet
类来执行命名空间的服务(例如Memcached
)。
但是,我们注意到zendframework/zend-modulemanager/src/Listener/ModuleResolverListener.php
中的以下行
if (class_exists($moduleName)) {
return new $moduleName;
}
这意味着如果我们将模块命名为Memcached
,那么加载模块就行不通了。该模块将被实例化为Memcached
对象而不是所需的MemcachedModule
对象。
那么,有什么方法可以简单地命名我们的模块Memcached
?或者,我们是否需要更具创造性,并将我们的模块命名为MemcachedModule
?我们宁愿不做后者,因为我们的其他模块都没有这个Module
后缀。
Zend Framework 3已经过修补,因此可以将模块命名为与现有类相同。以下代码已添加到ModuleResolverListener
:
$class = sprintf('%sModule', $moduleName);
if (class_exists($class)) {
return new $class;
}
所以现在,例如,我们可以创建自己的Zend模块,名为MemcachedModule
,它不会与php内置的Memcached
类冲突。
欲了解更多信息,view the patch on GitHub。
模块是使用PHP类编写的Zend。你不能有两个具有相同名称的类,所以你也不能导入具有相同名称的“模块类”和“自己的类”,但这只有在一个名称空间中工作时才有意义。您可以通过完整命名空间访问类。这是一些例子。
<?php
namespace myspace;
class TheOne {
function __construct() {
print "my one created
";
}
}
namespace otherspace;
use myspaceTheOne as MyOne;
class TheOne {
function __construct() {
print "other one created
";
}
}
new TheOne(); //other one created
new MyOne(); //my one created
以上是关于在Zend Framework 2或3中,模块名称可以与类名相同吗?的主要内容,如果未能解决你的问题,请参考以下文章
zend framework 2 + phpunit + 多模块 + 持续集成
带有 Zend Framework 2 模块的 PHPUnit