2012-02-14 5 views
1

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

Всех наших классов расширение объекта, который имеет конструктор, который использует 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 от их подбора в качестве имен столбцов/классов. Это методология, которую мы приняли на всех не дб членов, таких как:

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

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

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

+0

Вы пытались написать геттер? 'function get ($ field) {return $ this -> $ field; } 'и используя' get («contact») 'для извлечения контакта –

+0

BTW,' get_called_class' является излишним, учитывая поведение магической константы '__CLASS__' с PHP 5 – rdlowrey

+0

@rdlowrey спасибо, будет использовать в будущем Eugen, что что im использует сейчас, но это не помогает сэкономить :(Этот бизнес расширил меня.:/ –

ответ

1

Я не уверен, если я понимаю, что вы пытаетесь сделать, но это звучит как у вас есть 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

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

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

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

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

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

+0

Это работает очень хорошо. Спасибо, за исключением того, что при попытке сохранить объект inbounddata, который в настоящее время сохраняется() 'd из посещения, затем в этом перегруженном сохранении () есть вызов parent :: save(); это как-то не только возвращает vars из inbounddata, но и vars из посещения, все из которых используют get_class_vars из Object. –