我们想为我们的项目创建一个名为Memcached
的模块。这样我们就可以拥有命名空间的服务(例如MemcachedServiceGet
(,它使用 PHP 安装的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
它不会与Memcached
类中内置的php冲突。
有关详细信息,请查看 GitHub 上的修补程序。
模块是使用PHP类编写的Zend东西。您不能有两个同名的类,因此您也不能导入具有相同名称的"模块类"和"自己的类",但这仅在您在一个命名空间中工作时才相关。您可以按完整命名空间访问类。下面是一些示例。
<?php
namespace myspace;
class TheOne {
function __construct() {
print "my one createdn";
}
}
namespace otherspace;
use myspaceTheOne as MyOne;
class TheOne {
function __construct() {
print "other one createdn";
}
}
new TheOne(); //other one created
new MyOne(); //my one created