在 Zend Framework 2 或 3 中,模块名称可以与 class 名称相同吗?

in Zend Framework 2 or 3, can module name be same as class name?

我们想为我们的项目创建一个名为 Memcached 的模块。这样我们就可以拥有命名空间服务(例如 Memcached\Service\Get),这些服务使用 php 安装的 Memcached class.

执行操作

但是,我们注意到 zendframework/zend-modulemanager/src/Listener/ModuleResolverListener.php

中的以下几行
if (class_exists($moduleName)) {
    return new $moduleName;
}

这意味着如果我们将模块命名为 Memcached,那么加载模块将无法正常工作。该模块将被实例化为 Memcached 对象而不是所需的 Memcached\Module 对象。

那么,有没有什么方法可以简单地命名我们的模块 Memcached?或者,我们是否需要更有创意并将我们的模块命名为 MemcachedModule?我们不想做后者,因为我们其他模块的 none 有这个 Module 后缀。

模块是使用 PHP 类 编写的 Zend 东西。您不能有两个同名的 类,因此您也不能导入同名的 "module class" 和 "own class",但这仅在您在同一个命名空间中工作时相关。您可以通过完整命名空间访问 类。这是一些例子。

<?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

Zend Framework 3 已修补,因此模块可以与现有模块同名 class。 ModuleResolverListener:

添加了以下代码
$class = sprintf('%s\Module', $moduleName);
if (class_exists($class)) {
    return new $class;
}

所以现在,例如,我们可以创建自己的名为 Memcached\Module 的 Zend 模块,它不会与 php 的内置 Memcached class 冲突。

有关详细信息,view the patch on GitHub