Frage

Ich bin ein ORM in PHP zu schaffen, und ich habe eine Klasse ‚ORM‘ bekam, die im Grunde ein Objekt entsprechend einer Datenbanktabelle erstellt (ich bin mit dem Ziel für ähnliche / gleiche Funktionalität wie ein Active Record.) ORM selbst erstreckt ‚Datenbank‘, die die Datenbankverbindung einrichtet.

Also, ich kann anrufen:

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

Die ORM-Klasse stellt diese Funktionalität (legt die Klasseneigenschaften auf, bietet save (), finden (), findAll () usw. Methoden) und des Kunden erstreckt ORM. Doch in der Zukunft kann ich zusätzliche öffentliche Methoden für den Kunden hinzuzufügen fehlen (oder ein anderes Modell, das ich schaffen), so sollte diese ORM werden erstrecken oder nicht?

Ich weiß, dass ich nicht viele Informationen hier zur Verfügung gestellt haben, aber hoffentlich ist dies verständlich auf einer vage Erklärung, im Gegensatz zu veröffentlichen bis 300+ Zeilen Code.

War es hilfreich?

Lösung

Ich bin damit einverstanden hier mit den anderen Antworten - setzen die zusätzlichen Methoden in einer abgeleiteten Klasse. Ich würde auch einen Stern zu, dass, obwohl hinzuzufügen: jedes Mal, wenn Sie die Klasse mit zusätzlichen Methoden zu erweitern, darüber nachzudenken, was Sie versuchen, mit der Erweiterung zu erreichen, und darüber nachdenken, ob es nicht verallgemeinert werden kann und arbeitete wieder in die Elternklasse . Zum Beispiel:

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

Andere Tipps

Sie denken sicherlich richtig Ihre Geschäftslogik in einer neuen Klasse außerhalb Ihres ‚ORM‘ zu setzen. Für mich stattdessen einfach die ORM-Klasse erweitern, würde ich eher kapselt es mit einer neuen, Wert Objektklasse einen zusätzlichen Freiheitsgrad aus Ihrem Datenbank-Design, um Sie zu befreien von der Klasse als reines Business-Objekt zu denken.

Nein. Sie sollten Zusammensetzung statt Vererbung. Siehe das folgende Beispiel:

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

Und ORM Klasse sollte nicht Database verlängern. Zusammensetzung wieder am besten in diesem Anwendungsfall geeignet ist.

Ja, legen Sie Ihre Geschäftslogik in einer abgeleiteten Klasse. Dies ist ein sehr häufiges Muster in den meisten Data Access Layer Generation Frameworks gesehen.

Sie sollten unbedingt die ORM-Klasse erweitern. Verschiedene Dinge sollten Objekte verschiedener Klassen sein. Die Kunden sind sehr verschieden von Produkten, und beide in einer einzigen ORM-Klasse zu unterstützen, nicht benötigtes aufblasen würden und vollständig den Zweck der OOP besiegen.

Eine andere nette Sache zu tun ist, Haken für hinzufügen, bevor zu speichern, nachdem speichern, usw. Diese geben Ihnen mehr Flexibilität als ORM erstreckt Klassen vielfältiger geworden.

mein begrenztes Wissen über PHP Da ich nicht sicher bin, ob dies verwandt ist, aber wenn Sie viele Business-Objekte zu erstellen sind versucht, dies könnte ein unglaublich zeitaufwändig sein. Vielleicht sollten Sie Frameworks betrachten wie CakePHP und andere wie sie. Das ist schön, wenn man sich noch im Prozess der Erstellung Ihrer Business-Logik ist.

Sie sind auf jeden Fall in der richtigen Richtung mit Vererbung denken hier.

Wenn Sie ein ORM Gebäude sind nur um einen zu bauen (oder weil Sie nicht wie die Art und Weise andere Dinge behandeln) als für ihn zu gehen, sonst hat man bei einem vorgebauten ORM aussehen könnte, dass die meisten Ihrer generieren Code direkt von Ihrem Datenbankschema. Es wird Sie boatloads Zeit sparen. CoughPHP ist zur Zeit mein Favorit.

Ich habe es wie dies in meinem Pork.dbObject . Stellen Sie sicher, es zu überprüfen und snag einige der braincrunching habe ich schon: 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
}

Beachten Sie, dass auf diese Weise, eine beliebige Datenbank oder ORM-Funktionalität von der Poll-Objekt abstrahiert entfernt. Dabei spielt es keine Notwendigkeit zu kennen. Gerade die setupdatabase die Felder / Zuordnungen zu anschließen. und die addRelation einzuhaken, die Beziehungen zu anderen DBObjects auf.

Auch selbst die DBObject Klasse weiß nicht viel über SQL. Wählen / Join-Abfragen durch ein spezielles Objekt Querybuilder gebaut werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top