在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 设置全局模块变量

zend framework 2 + phpunit + 多模块 + 持续集成

Zend Framework2如何建立新的模块

带有 Zend Framework 2 模块的 PHPUnit

如何在 Zend Framework 2 中为局部使用共享视图脚本路径?

Zend 2 Framework - Doctrine从给定的2个实体生成表