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