我们想为我们的项目Memcached
创建一个模块。这样我们就可以使用php安装的Memcached\Service\Get
类来执行命名空间的服务(例如Memcached
)。
但是,我们注意到zendframework/zend-modulemanager/src/Listener/ModuleResolverListener.php
中的以下行
if (class_exists($moduleName)) {
return new $moduleName;
}
这意味着如果我们将模块命名为Memcached
,那么加载模块就行不通了。该模块将被实例化为Memcached
对象而不是所需的Memcached\Module
对象。
那么,有什么方法可以简单地命名我们的模块Memcached
?或者,我们是否需要更具创造性,并将我们的模块命名为MemcachedModule
?我们宁愿不做后者,因为我们的其他模块都没有这个Module
后缀。
Zend Framework 3已经过修补,因此可以将模块命名为与现有类相同。以下代码已添加到ModuleResolverListener
:
$class = sprintf('%s\Module', $moduleName);
if (class_exists($class)) {
return new $class;
}
所以现在,例如,我们可以创建自己的Zend模块,名为Memcached\Module
,它不会与php内置的Memcached
类冲突。
欲了解更多信息,view the patch on GitHub。
模块是使用PHP类编写的Zend。你不能有两个具有相同名称的类,所以你也不能导入具有相同名称的“模块类”和“自己的类”,但这只有在一个名称空间中工作时才有意义。您可以通过完整命名空间访问类。这是一些例子。
<?php
namespace my\space;
class TheOne {
function __construct() {
print "my one created\n";
}
}
namespace other\space;
use my\space\TheOne as MyOne;
class TheOne {
function __construct() {
print "other one created\n";
}
}
new TheOne(); //other one created
new MyOne(); //my one created