Ben bu sınıfı uzanan olmalı?

8 Cevap php

PHP bir ORM kuruyorum, ve ben temelde bir veritabanı tabloya karşılık gelen bir nesne oluşturur bir sınıf 'ORM' var (Ben bir ActiveRecord desen olarak / aynı işlevselliği benzer amaçlayan ediyorum.) ORM kendisi 'uzanır veritabanı bağlantısını kurar Veritabanı '.

So, I can call:

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

ORM sınıfı bu işlevselliği sağlar (sınıf özelliklerini ayarlar, (bulmak, () tasarruf sağlar), findAll (), vb yöntemleri), ve Müşteri ORM uzanır. Ancak, ileride ben, Müşteri (veya ben oluşturmak başka bir model) ekstra bir ortak yöntem eklemek isteyen olabilir, bu nedenle bu ORM uzanan edilip edilmeyeceği?

Ben burada fazla bilgi vermemesi biliyorum, ama kod 300 + hatları ilanıyla karşı umarım bu, belli belirsiz bir açıklama üzerinde anlaşılabilir.

8 Cevap

Ben burada diğer yanıtlar ile katılıyorum - Bir alt sınıfa ek metotlar koydu. Ben de o düşünceden bir yıldız eklemek istiyorum: Eğer ekstra yöntemleri ile sınıfını genişleten her zaman, size uzantısı ile ulaşmak için çalışıyoruz ne düşünmek, ve genelleştirilmiş ve üst sınıfa geri çalışmış olabilir olup olmadığını düşünmek . Örneğin:

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

Sen kesinlikle 'ORM' dışında yeni bir sınıfın iş mantığı koymak doğru düşünüyorsun. Benim için, bunun yerine sadece ORM sınıf uzanan, oldukça saf bir iş nesnesi olarak sınıfının düşünmek sizi boşaltmak için veritabanı tasarımı özgürlük ek bir derecede sağlamak için yeni bir değer nesnesi sınıf ile saklanması ediyorum.

Hayır. Sen kompozisyon yerine miras kullanmalısınız. Aşağıdaki örneğe bakın:

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

Ve ORM class Database genişletmek gerekir. Kompozisyon yine en iyi bu kullanım durumda uygundur.

Evet, bir alt sınıfta iş mantığını yerleştirmek. Bu, çoğu Data Access Katmanlar nesil çerçeveler görülen çok yaygın bir kalıptır.

Kesinlikle ORM sınıfını genişletmek gerekir. Farklı şeyler farklı sınıflardan nesneler olmalıdır. Müşteriler tek bir ORM sınıfta hem de gereksiz kabartmak olacak ve tamamen OOP amacı yenmek Ürünler çok farklı, ve desteklemek.

Yapılacak başka güzel şey Bunlar size ORM sınıfları daha çeşitli hale uzanan olarak daha fazla esneklik verir, vb sonra kaydetmek, önce kaydetmek için kanca eklemektir.

PHP benim sınırlı bilgi göz önüne alındığında ben bu ilgili ise emin değilim, ama birçok iş nesneleri oluşturmak için çalışıyoruz, bu inanılmaz zaman alıcı bir süreç olabilir. Belki de böyle CakePHP olarak çerçeveler ve bunun gibi diğerleri düşünmelisiniz. Eğer iş mantığını oluşturma sürecinde hala iseniz bu güzel.

Kesinlikle burada miras ile doğru çizgiler boyunca düşünüyoruz.

, Bunun için gitmek daha (diğerleri şeyleri ele beğenmiyorum çünkü ya) sadece bir bina uğruna bir ORM inşa ediyorsanız, aksi takdirde düz sizin kod çoğu üretebilir hazır bir ORM bakmak olabilir Veritabanı şeması. Bu size zaman boatloads tasarruf edeceğiz. CoughPHP Şu anda benim favorim.

Benim Pork.dbObject bu gibi çözmüş. P: bunu kontrol ve ben zaten yaptım braincrunching bazı yakala emin olun

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
}

Bu şekilde, herhangi bir veritabanı veya ORM işlevselliği uzak Anket nesneden soyutlanmış unutmayın. Bu need bilmek değildir. Alanları / eşleştirmeleri kanca kadar sadece setupdatabase. ve addRelation diğer dbObjects için ilişkileri kanca.

Ayrıca, hatta DBObject sınıf SQL hakkında çok şey bilmiyor. Seç / join sorguları özel QueryBuilder nesnesi tarafından inşa edilmiştir.