2008-09-28 13 views
2

私はPHPでORMを作成していますが、基本的にデータベーステーブルに対応するオブジェクトを作成するクラス 'ORM'を持っています(私はActiveRecordパターンと同様の機能を目指しています)。 )ORM自体は、データベース接続を設定する 'Database'を拡張します。このクラスを拡張するべきですか? (PHP)

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

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

をORMクラスは、この機能を提供します((セーブ提供し、クラスのプロパティを設定)、()を見つける、のfindAll()などのメソッド)、およびお客様は、ORMを拡張します。しかし、将来、私は顧客(または私が作成した他のモデル)に余分なパブリックメソッドを追加したいかもしれないので、ORMを拡張するべきかどうか?

私はここに多くの情報を提供していないことを知っていますが、うまくいけば、300行以上のコードを投稿するのではなく、あいまいな説明で理解できると思います。

+0

さらに別のORM?これも同様にオープンソースになるのだろうか?気になります! – Till

+0

タイトルとタグの "PHP"を削除することが考えられるかもしれません。これは、OOPについての非常に一般的な質問であり、PHPには特別なものではないからです。 – nickf

+0

質問にはPHPが参照されていますが、それはOOPの質問のためです。 – Chris

答えて

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 
} 
1

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

2

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

0

絶対にORMクラスを拡張する必要があります。異なるものは、異なるクラスのオブジェクトでなければなりません。顧客は製品とは非常に異なり、ORMクラスで両方をサポートすると、不必要な膨らみが発生し、OOPの目的を完全に無効にします。

もう一ついいことは、保存前、保存後などにフックを追加することです。これにより、ORM拡張クラスが多様化するにつれ、より柔軟性が得られます。

0

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

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を拡張するべきではありません。このユースケースでは、もう一度構図が最適です。

+0

構成は、OO設計では巨大ではありません。 – Till

+0

これは継承よりも優れている理由についての情報はありますか? – nickf

+1

継承は「is」関係ですが、構成は「has」関係です。したがって、「ORMはデータベース接続です」という記述は誤りです。代わりに、 "ORMにはデータベース接続があります"と記述する必要があります。 –

0

私はこれを私のPork.dbObjectのように解決しました。この方法は、任意のデータベースまたはORM機能が離れポーリングオブジェクトから抽象化されていることを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 
} 

注:それをチェックアウトし、私はすでにやったbraincrunchingの一部を暗礁することを確認します。知るにはにはが必要ではありません。フィールド/マッピングをフックアップするためのセットアップデータベースです。他のdbObjectとの関係をフックアップするためのaddRelation

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

0

あなたは間違いなく、ここで継承された正しい線に沿って考えています。

ビルドのためだけにORMを構築している場合(または他の人の操作方法が気に入らないため)、そうでなければ、ほとんどの場合、ORMを生成することができます。あなたのデータベーススキーマから直接あなたのコード。それは時間のボートロードを保存します。 CoughPHPは現在私のお気に入りです。

関連する問題