2

PHPでORMを作成していますが、基本的にデータベーステーブルに対応するオブジェクトを作成するクラス「ORM」があります(ActiveRecordパターンと同様の/同じ機能を目指しています)。ORM自体は拡張されます。データベース'、データベース接続を設定します。

だから、私は呼び出すことができます:

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

ORMクラスはこの機能を提供し(クラスプロパティを設定し、save()、find()、findAll()などのメソッドを提供します)、CustomerはORMを拡張します。ただし、将来的には、Customer(または私が作成する他のモデル)にパブリックメソッドを追加したいと思うかもしれません。これでORMを拡張する必要がありますか?

ここではあまり情報を提供していないことは知っていますが、300行以上のコードを投稿するのではなく、漠然とした説明で理解できることを願っています。

4

8 に答える 8

3

私はここで他の答えに同意します-追加のメソッドを子孫クラスに入れます。ただし、それにアスタリスクを追加します。追加のメソッドを使用してクラスを拡張するたびに、拡張で何を達成しようとしているのかを考え、一般化して親クラスに戻すことができるかどうかを考えます。 。例えば:

// 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
}
于 2008-09-29T01:04:17.883 に答える
2

あなたは確かにあなたのビジネスロジックをあなたの「ORM」の外の新しいクラスに置くことを正しく考えています。私にとっては、単にORMクラスを拡張するのではなく、新しい値オブジェクトクラスでカプセル化して、データベース設計からの自由度を高め、クラスを純粋なビジネスオブジェクトと考えることができるようにします。

于 2008-09-28T23:28:33.243 に答える
2

いいえ。継承の代わりに構成を使用する必要があります。次の例を参照してください。

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。この場合も、コンポジションが最適です。

于 2008-09-29T01:56:32.640 に答える
1

はい、ビジネスロジックを子孫クラスに配置します。これは、ほとんどのデータアクセスレイヤー生成フレームワークで見られる非常に一般的なパターンです。

于 2008-09-28T23:07:23.670 に答える
0

私は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 を使用して、関係を他の dbObjects に接続します。

また、dbObject クラスでさえ SQL についてあまり知りません。選択/結合クエリは、特別な QueryBuilder オブジェクトによって構築されます。

于 2008-09-29T06:39:38.277 に答える
0

ORM クラスは絶対に拡張する必要があります。異なるものは、異なるクラスのオブジェクトであるべきです。顧客は製品とは非常に異なっており、単一の ORM クラスで両方をサポートすることは、不必要に肥大化し、OOP の目的を完全に無効にします。

もう 1 つの良い方法は、保存前、保存後などのフックを追加することです。これらにより、ORM 拡張クラスが多様化するにつれて、柔軟性が向上します。

于 2008-09-29T00:10:10.477 に答える
0

私の PHP に関する知識は限られているため、これが関連しているかどうかはわかりませんが、多くのビジネス オブジェクトを作成しようとしている場合、これは非常に時間がかかるプロセスになる可能性があります。おそらく、CakePHPなどのフレームワークを検討する必要があります。これは、まだビジネス ロジックを作成中の場合に便利です。

于 2008-09-29T00:14:01.683 に答える
0

ここでの継承に関して、あなたは間違いなく正しい方向に沿って考えています。

ORM を構築するためだけに ORM を構築している場合 (または、他の人が物事を処理する方法が気に入らないため) に行くよりも、それ以外の場合は、ほとんどのコードを直接生成できる事前構築済みの ORM を検討することができます。データベース スキーマ。時間を大幅に節約できます。CoughPHPは現在、私のお気に入りです。

于 2008-09-29T07:37:01.480 に答える