Некоторое время назад я написал небольшую структуру, и я решил использовать первое предложенное вами решение.
Хранить совокупные корни в корне модели домена:
Почему?
На самом деле я задал себе тот же вопрос, который вы задаете сегодня, и после небольшого разговора с моими товарищами по команде мы согласились, что было бы логичнее не повторять имя класса в пространстве имен.
Давайте посмотрим, как реализовать ваши классы с помощью решения n ° 2
Customer\Customer
Customer\Address
Вам нужно будет написать:
$customer = new Customer\Customer();
$address = new Customer\Address();
Вы можете видеть повторение, верно? Это как-то не похоже на меня.
На мой взгляд, это все равно что писать
$customer->getCustomerId();
Зачем повторять Customer в названии метода? Мы знаем, что это идентификатор клиента, так как мы используем объект Customer.
Еще одна «плохая вещь» этой модели - невозможность использовать зарезервированное ключевое слово в качестве имени класса.
Например, используя соглашение о груше, вы могли бы иметь класс
Customer_Abstract
Находится по адресу Customer / Abstract.php, что хорошо для меня, но если вы попытаетесь перевести его, используя пространство имен, у вас будет
namespace Customer;
class Abstract {}
, что приводит к фатальной ошибке. Поэтому вам снова придется повторить домен в имени класса:
namespace Customer;
class AbstractCustomer {}
$customer = new Customer\AbstractCustomer();
Теперь давайте посмотрим, как реализовать ваши классы с помощью решения n ° 1
Customer
Customer\Address
Вы напишите:
$customer = new Customer();
$address = new Customer\Address();
Нам больше не нужно повторять Customer дважды, чтобы создать экземпляр класса Customer. Однако все еще ясно, что Адрес связан с Заказчиком.
Вот почему я решил использовать эту модель.
РЕДАКТИРОВАТЬ: Zend Framework 2 использовать это соглашение тоже