2013-06-23 4 views
2

Я хотел бы получить ваш совет о том, как проектировать объекты в модульной системе CMS. Я искал часы, но я просто не мог найти правильных ответов.PHP OOP Modular CMS Дизайн объектов

Как создать классы для взаимодействия с вещами? Допустим, у меня есть эти классы:

cDb() // for database interactions 
cUser() // for all user actions 
cSession() // for interactions with session data. 
cAnotherObject // multiple another objects from future modules 

Должен ли я каким-то образом расширить их все, так что в конце концов, я в конечном итоге с одного объекта, как это:

$myvar = new cLatestClass(); 

[cSession расширяет CDB, cUser расширяет cSession ... и т. д.]

Если да, то как это сделать с динамически загружаемыми классами в модулях? Лучше просто использовать несколько var s с объектами?

$user = new cUser(); 
$session = new cSessions(); 
... etc. 

Я действительно надеюсь, что кто-то здесь может ответить мне и, надеюсь, научит меня, как это сделать должным образом.

+0

Посмотрите на зависимость впрыска –

ответ

3

Прежде всего, я бы рекомендовал сделать шаг назад и узнать, что такое ориентация на объект. Алан Кей, который ввел термин «объектно-ориентированное программирование,» однажды описал его следующим образом:

Я думал объекты похожения биологических клеток и/или отдельные компьютеров в сети, только в состоянии общаться с сообщениями , (source)

В PHP (и в большинстве объектно-ориентированных языков), эти сообщения, как правило, вызовы методов, или в случае государственной собственности, получать и устанавливать их значения.

Так что подумайте об объектах в вашей системе как о отдельных клетках в более крупном организме, которые сотрудничают для достижения большей цели, а не о попытке смешать все поведение, которое вам нужно вместе, в один объект.

Это большая тема, и на ней написано много книг, но с точки зрения объектов, которые вы упомянули в своем вопросе, я бы сначала сделал различие между различными категориями, в которые они попадают. База данных или объект сеанса можно рассматривать как тип «службы», от которого зависят другие объекты (например, ваши контроллеры, если вы используете структуру MVC). Как отмечали другие, инъекция зависимостей является хорошим решением для обработки таких сервисов, но в большинстве случаев я бы не рекомендовал ее использовать для чего-то вроде класса User, для которого должен быть один экземпляр для пользователя (не буквально, конечно, вы - 'd загружает только определенные пользовательские объекты в память, которые вам нужны для обработки конкретного запроса, во многих случаях просто экземпляр для текущего пользователя).

Чтобы узнать больше об инъекции зависимостей, я рекомендую this article, где Мартин Фаулер придумал термин, а также где он упоминает более простую альтернативу контейнера инъекций зависимостей, называемого локатором сервисов.

(Зависимость впрыска контейнер подход более надежный, но также более сложный, к счастью, есть good open-source library for it).

Пользователь, статья и категория были бы примерами объектов домена в CMS. Они являются частью «M» (модели) MVC (также известной как доменная модель ). Конечно, вам все равно нужен способ получить эти объекты из базы данных и из нее, так что вам, вероятно, также понадобятся какие-то классы репозитория или запроса (класс репозитория может быть считаться сервисом). Не все системы PHP имеют настоящие объекты домена; многие просто имеют классы, подобные репозиториям, которые возвращают массивы или объекты stdClass (простые анонимные объекты, созданные следующим образом: $someObj = new stdClass), что означает, что эти системы не соответствуют истинному объектно-ориентированному программированию, но часто есть практические причины, по которым такие решения принимаются ,

Реальная цель объектно-ориентированного программирования идет глубже, чем то, что я упомянул выше: речь идет о проектировании объектов в системе, чтобы отразить нашу ментальную модель (совместную ментальную модель, которая включает в себя перспективу обоих конечных пользователей и программисты). Вот еще одна хорошая цитата, на этот раз от Trygve Reenskaug, который изобрел шаблон MVC:

я думаю о разнице между процедурой ориентированных и объектно ориентированное программирование как эта процедура Ориентированно отвечает на вопрос: «Что происходит? ». Объектно-ориентированный ответ на вопрос : «Кто это?» (source)

Наконец, я бы рекомендовал прочитать книгу, в которой конкретно рассматривается объектно-ориентированное программирование на PHP. Очень хороший PHP Objects, Patterns and Practice от Matt Zandstra.

+1

Спасибо за ваш изнурительный ответ :) Я собираюсь прочитать те статьи, которые вы указали. Я очень ценю, что вы вложили свое время в этот ответ, поэтому я знал, что было бы неплохо спросить здесь о stackoerflow! :) – mchamuty

+0

Добро пожаловать. Кстати, я думаю, вы имели в виду «исчерпывающий», а не «изнурительный», хотя я могу видеть, как мой ответ тоже может изнуриться! ;) –

1

Должен ли я каким-то образом расширить их все, так что в конце концов, я в конечном итоге с одного объекта, как это:

Нет, конечно, вы не должны. При расширении классов вы должны иметь отношение is-a.

Сессия не является базой данных. И пользователь, конечно же, не является сессией. Вероятно, что вы ищете dependency injection.

Допустим, что вашему классу User требуется подключение к базе данных. Это будет выглядеть примерно так:

class User 
{ 
    private $dbConnection; 

    public function __construct(\PDO $dbConnection) 
    { 
     $this->dbConnection = $dbConnection; 
    } 

    public function doSomethingWithDb() 
    { 
     $this->dbConnection->query('SELECT...'); 
    } 
} 

$dbConnection = new PDO('/* dsn string */', 'user', 'pass'); 
$user = new User($dbConnection); 

Было бы еще лучше, если бы извлечь запрос к базе данных от User класса, так что вы не привязаны к использованию базы данных все это.

Также как примечание CS: почему вы добавляете свои классы с c?

Относительно вашей модульной системы. Это будет зависеть от того, как вы собираетесь настраивать свои модули, но вам может потребоваться заглянуть в контейнер для инъекций зависимостей для объединения динамических модулей.

+0

Не против «c», просто глупая привычка: DI не делает этого в большинстве моих проектов :) Я только начал это из-за примера в одной книге :) Но спасибо вы за ответ, я сегодня пойду на уколы зависимости :) Спасибо! :) – mchamuty