Вопрос

Я создаю ORM на PHP, и у меня есть класс «ORM», который в основном создает объект, соответствующий таблице базы данных (я стремлюсь к аналогичной/той же функциональности, что и шаблон ActiveRecord.) Сам ORM расширяется. База данных», который устанавливает соединение с базой данных.

Итак, я могу позвонить:

$c = new Customer();
$c->name = 'John Smith';
$c->save();

Класс ORM предоставляет эту функциональность (настраивает свойства класса, обеспечивает save(), find(), findAll() и т. д.методы), а Клиент расширяет ORM.Однако в будущем я, возможно, захочу добавить дополнительные общедоступные методы в Customer (или любую другую созданную мной модель), так должно ли это быть расширением ORM или нет?

Я знаю, что не предоставил здесь много информации, но, надеюсь, это понятно из расплывчатого объяснения, а не из более чем 300 строк кода.

Это было полезно?

Решение

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

// Customer.class.php
function getByName($name) {
    // SELECT * FROM `customer` WHERE `name` = $name
}

// ** this could instead be written as: **
// ORM.class.php
function getByField($field, $value) {
    // SELECT * FROM `$this->table` WHERE `$field` = $value
}

Другие советы

Вы, безусловно, правильно думаете, поместив свою бизнес-логику в новый класс за пределами вашего «ORM».По моему мнению, вместо того, чтобы просто расширять класс ORM, я бы предпочел инкапсулировать его в новый, ценный объектный класс, чтобы обеспечить дополнительную степень свободы при проектировании вашей базы данных, чтобы вы могли думать об этом классе как о чистом бизнес-объекте.

Неа.Вместо наследования следует использовать композицию.См. следующий пример:

class Customer {
    public $name;
    public function save() {
        $orm = new ORM('customers', 'id'); // table name and primary key
        $orm->name = $this->name;
        $orm->save();
    }
}

И ORM класс не должен расширяться Database.Композиция снова лучше всего подходит в этом случае.

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

Вам обязательно следует расширить класс ORM.Разные вещи должны быть объектами разных классов.Клиенты сильно отличаются от продуктов, и поддержка обоих в одном классе ORM была бы ненужным раздуванием и полностью противоречила бы цели ООП.

Еще одна приятная вещь — добавить хуки перед сохранением, после сохранения и т. д.Это дает вам больше гибкости, поскольку ваши классы расширения ORM становятся более разнообразными.

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

Вы определенно думаете в правильном направлении относительно наследования.

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

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

class Poll extends dbObject // dbObject is my ORM. Poll can extend it so it gets all properties.
{
        function __construct($ID=false)
        {
            $this->__setupDatabase('polls', // db table
                array('ID_Poll' => 'ID',    // db field => object property
                        'strPollQuestion' => 'strpollquestion', 
                        'datPublished' => 'datpublished', 
                        'datCloseDate' => 'datclosedate', 
                        'enmClosed' => 'enmclosed', 
                        'enmGoedgekeurd' => 'enmgoedgekeurd'),
                        'ID_Poll',  // primary db key 
                        $ID);   // primary key value
        $this->addRelation('Pollitem'); //Connect PollItem to Poll 1;1
        $this->addRelation('Pollvote', 'PollUser'); // connect pollVote via PollUser (many:many)


        }

function Display()
{

 // do your displayíng for poll here:
    $pollItems = $this->Find("PollItem"); // find all poll items
    $alreadyvoted = $this->Find("PollVote", array("IP"=>$_SERVER['REMOTE_ADDR'])); // find all votes for current ip
}

Обратите внимание, что таким образом любая функциональность базы данных или ORM абстрагируется от объекта Poll.Это не так нуждаться знать.Просто база данных настройки для подключения полей/сопоставлений.и addRelation для связи с другими объектами dbObject.

Кроме того, даже класс dbObject мало что знает об SQL.Запросы выбора/соединения создаются с помощью специального объекта QueryBuilder.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top