в Zend Framework 2 или 3 может ли имя модуля совпадать с именем класса?

Мы хотели бы создать модуль для нашего проекта под названием 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 суффикс.

0

Решение

Zend Framework 3 был исправлен, так что модуль может быть назван так же, как существующий класс. Следующий код был добавлен в ModuleResolverListener:

$class = sprintf('%s\Module', $moduleName);
if (class_exists($class)) {
return new $class;
}

Так, например, теперь мы можем создать наш собственный модуль Zend под названием Memcached\Module который не будет конфликтовать с встроенным в PHP Memcached учебный класс.

Для получения дополнительной информации, посмотреть патч на GitHub.

0

Другие решения

Модуль 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
-1

По вопросам рекламы [email protected]