在 Zend Framework 2 或 3 中,模块名可以和类名一样吗?



我们想为我们的项目创建一个名为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

相关内容

最新更新