2015-11-26 3 views
0

Я построил «модельный» суперкласс для структуры MVC. В большинстве методов мне нужно только имя класса, поэтому я использовал get_called_class(), но для методов сохранения и редактирования мне нужно передать объект со значениями.Получить вызывающий объект из суперкласса

В моей конструкции, при создании модели объекта и сохранения или редактирования вы должны сделать:

$object->save($object); или $object->update($object, $id).

Я действительно не нравится это, потому что выглядит как плохой дизайн. Я хотел бы просто сказать:

$object->save(); and $object->update($id); 

Поскольку вы эффективно сохраняете текущий объект.

Модели классов расширяет родительский элемент модели, который определяет их поведение и создает для них соединение с БД.

Методы суперкласса, которые я хотел бы сделать, не воспринимаются как аргумент $ object, но я бы хотел сказать «получить вызывающий объект».

public function save($object) { 

     return self::$db->save($object); 
    } 

    public function update($object,$id) { 
     return self::$db->update($object, $id); 
    } 

Я знаю, что это может быть легко выполнимо в объектной модели с

public function save() { 
parent::save($this); 
} 

Но я не хотел бы иметь переопределять это поведение для каждой модели!

Заранее спасибо. Использование любой существующей библиотеки ORM здесь не обсуждается, так как я хочу предоставить построитель запросов и простой ORM, основанный на PDO по умолчанию. Потому что я не хочу иметь зависимость от третьей стороны по умолчанию

+0

Почему бы не использовать библиотеки ORM? Их много с реализациями ActiveRecord или DataMapper. http://propelorm.org/ http://www.doctrine-project.org/, чтобы назвать несколько. –

ответ

1

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

abstract class Model 
{ 
    public function save() { 
     return self::$db->save($this); 
    } 

    public function update($id) { 
     return self::$db->update($this, $id); 
    } 
} 

class UserModel extends Model; 

$myModel = new UserModel(); 
$myModel->save(); 
+0

Ty я попробую, и если он соответствует вашему ответу;) –

+0

Прошу прощения за путаницу с ключевым словом «реализует». Он подходит только для интерфейсов, конечно, классы «расширяются». –

+0

Код работает, так что все в порядке, я уже отредактировал вам ошибку! –