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

问题描述 投票:0回答:2

我们想为我们的项目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后缀。

php zend-framework module naming
2个回答
0
投票

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


-1
投票

模块是使用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
© www.soinside.com 2019 - 2024. All rights reserved.