Мы хотели бы создать модуль для нашего проекта под названием Memcached
, Таким образом, мы можем иметь услуги с пространством имен (например, Memcached\Service\Get
) которые выполняют действия с использованием установленного php Memcached
учебный класс.
Тем не менее, мы замечаем следующие строки в zendframework/zend-modulemanager/src/Listener/ModuleResolverListener.php
if (class_exists($moduleName)) {
return new $moduleName;
}
Это означает, что если мы назовем наш модуль Memcached
, то загрузка модуля просто не будет работать. Модуль будет создан как Memcached
объект, а не желаемый Memcached\Module
объект.
Итак, есть ли способ, которым мы можем просто назвать наш модуль Memcached
? Или мы должны быть более креативными и назвать наш модуль как MemcachedModule
? Мы предпочли бы не делать последнее, так как ни один из наших других модулей не имеет этого Module
суффикс.
Zend Framework 3 был исправлен, так что модуль может быть назван так же, как существующий класс. Следующий код был добавлен в ModuleResolverListener
:
$class = sprintf('%s\Module', $moduleName);
if (class_exists($class)) {
return new $class;
}
Так, например, теперь мы можем создать наш собственный модуль Zend под названием Memcached\Module
который не будет конфликтовать с встроенным в PHP Memcached
учебный класс.
Для получения дополнительной информации, посмотреть патч на GitHub.
Модуль Zend написан с использованием PHP-классов. У вас не может быть двух классов с одинаковыми именами, поэтому вы также не можете импортировать «класс модуля» и «собственный класс» с одинаковыми именами, но это связано, только если вы работаете в одном пространстве имен. Вы можете получить доступ к классам по полному пространству имен. Вот пример.
<?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