ООП Наследование - PullRequest
       6

ООП Наследование

1 голос
/ 14 февраля 2012

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

Все наши классы расширяют Object, который имеет конструктор, который использует get_called_class() для получения класса, а затем get_class_vars () и т. Д. Для загрузки имен столбцов, что означаету нас может быть save, delete, displayExisting, getAll и несколько других методов в классе по умолчанию, что устраняет большое количество кода.Это хорошо.Теперь у меня есть класс InboundData, у него есть 3 расширяемых класса, называемых Visit, Enquiry и BrochureRequest, у них есть «inbound_data_id», тогда InboundData имеет перегруженный конструктор, выглядящий примерно так:

function __construct($id = '')
{   
    $this->className = get_called_class();
    $this->id = (int)$id;
    $this->tableName = strtolower($this->className);
    $this->setDbFields();
    $this->loadData();

    $this->contact = new Contact($this->contact_id);
    $this->address = new Address($this->address_id);
    $this->domain = new Domain($this->domain_id);
    $this->park = new Park($this->park_id);
}

Проблема в том, что contact, address, domain и park все защищены, чтобы не дать методам Object выбрать их в качестве имен столбцов / классов.,Мы применили эту методологию ко всем членам, не относящимся к db, например:

protected $contact;
protected $address;
protected $domain;
protected $park;

Мы не сталкивались с какими-либо проблемами. До написания кода внешнего интерфейса я обнаружил, что, очевидно, не могузаполните $formObj->contact->var и т. д., не говоря уже о том, что я не написал никакого кода сохранения для расширенных объектов входящих данных, который должен был бы сохранить все прикрепленные таблицы.

Пожалуйста, мог бы гуру ООП сообщить нам, гдемы ошиблись, и каким будет лучший способ добиться этого.Не стесняйтесь задавать любые вопросы, я знаю, что это звучит довольно странно.

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Я не уверен, что понимаю, что вы пытаетесь сделать, но похоже, что у вас есть объект Template, который отображает страницу, и вы хотите получить Enquiry (например)contact значение и примените его к шаблону.Я предлагаю сделать что-то вроде этого:

class TemplateBuilder {
    public static function addDataToTemplate(Template $tpl, Object $enq) {
       $enq->addToTemplate($tpl);
    }
}

Это не является абсолютно необходимым, но следующий шаг:

class Enquiry extends Object {
   ...
   public function addToTemplate(Template $tpl) {
      $tpl->contact->var = $this->contact;
   }
}

Это обеспечивает защиту только Enquiry данных, как и выхотите, чтобы это было, и вы получаете очень специфический контроль над тем, какие данные вы хотите добавить к каким объектам.

Это немного не по теме, но я бы посоветовал не использовать расширение и проходить через всю эту магию,Если у вас есть много служебных методов, которые могут использовать классы, расширяющие Object, вы можете сконструировать их с Object (или как его там) в качестве члена и использовать его с помощью композиции.

1 голос
/ 14 февраля 2012

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

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

Что касается настройки свойств. Разве вы не можете просто добавить геттеры / сеттеры для доступа к тому, что вам нужно? Рассматривали ли вы использование магических методов __get () и __set ()?

Распространенным способом отслеживания изменений, которые необходимо сохранить, является использование флага isDirty. Следующая проблема - отслеживать объекты, которые вы загрузили из базы данных. Обычно это решается с помощью менеджера сущностей.

Если вы сталкиваетесь с проблемами при настройке свойств объектов, которые не могут быть решены, вы можете использовать Reflection API для принудительной установки некоторых свойств. ReflectionProperty :: setAccessible () может позволить вам установить значение для частного / защищенного свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...