OOP tasarım: uygulama nesneleri içine DB işleme dahil etmek nasıl

3 Cevap php

Bu düzenli yüz bir tasarım sorunu olduğunu ve konuyla ilgili bazı genel bilgiler bulmak istiyorum. Burada sağlanan kod sadece bir örnektir.

Tasarım aşamasında size bir nesne gerekir karar vermek kolay:

User
==========
Unique ID
Login name
Password
Full name

Ve bir veritabanı nesnesi haline dönüştürmek kolay:

CREATE TABLE user (
    user_id INT NOT NULL PRIMARY KEY,
    username VARCHAR(15) NOT NULL UNIQUE,
    password_hash CHAR(32) NOT NULL,
    full_name VARCHAR(50)
);

Benim şüphelerim PHP seviyesinde başlar. Açık dönüşüm:

<?php
class User{
    public $user_id, $username, $full_name;
}
?>

Ancak, nasıl ben gerçek değerlerle doldurmak gerekir?

Ben DB-agnostik sınıf tutabilirsiniz:

<?php
class User{
    public $user_id, $username, $full_name;
    public function __construct($user_id, $username, $full_name){
        $this->user_id = $user_id;
        $this->username = $username;
        $this->full_name = $full_name;
    }
}
?>

Ama sonra başka bir yere sorguyu çalıştırmak için gereken ...

Ben sınıf yapıcısı içine sarabiliriz:

<?php
class User{
    public $user_id, $username, $full_name;
    public function __construct($user_id){
        $sql = 'SELECT username, full_name FROM user WHERE user_id=?';
        $parameters = array($user_id);
        $res = get_row_from_db($sql, $parameters);

        $this->user_id = $user_id;
        $this->username = $res['username'];
        $this->full_name = $res['username'];
    }
}
?>

Bu zarif görünüyor ama sınıf sürü yapıyor beni engelleyen:

  • Kullanıcı adı ve şifre ile bir kullanıcıyı doğrulamak ($ ​​User_id henüz bilinmemektedir)
  • Forum iletilerinden yazdırma kullanıcı bilgisi (ben 100 kullanıcılara göstermek için 100 sorguları göze alamaz)

Büyük olasılıkla, birkaç sınıfları tanımlamak gerekiyor ama bunu nasıl organize konusunda emin değilim. Bir temel sınıf ve birçok çocuk sınıfları? Bağımsız sınıfları? Belirli yöntemleri ile tek bir sınıf? Belki de bilinen bir tasarım deseni ama ben prosedürel programlama öğretildi.

Ben de bazı fikirler hakkında takdir ediyorum:

  • Kullanıcıların bir koleksiyon Taşıma
  • Oturumda bilgi depolamak böylece DB her sayfa isteği üzerine sorgulanacak gerekmez

==== FOR THE RECORDS====

Ilginç bir okuma sunuyor için ben cevap olarak Gordon'un Cevabı etiketlendi ettik. Ne olursa olsun, ben bir very illustrative code snippet aşağıdaki gibi özetlenebilir PHP kılavuzun Nesne Serileştirme sayfasında kullanıcı yorumlarından birinde buldum fazlalaştı:

  • Bu bir sınıf kullanır.
  • Bir örnek, belirli bir kullanıcıyı temsil eder.
  • Yapıcı kullanıcı bilgileri ile beslenir.
  • Sınıfı, örneğin, bir örneği var edememek önce gerekli işlevleri için statik yöntemler sağlar ID ya da adına göre DB bir kullanıcı getiriliyor.
  • Kullanıcı örnekleri oturumu veri olarak serileştirilebilir.

Bir OOP guru olmak, ben buldum değil, çok basit ama temiz ve kullanışlı. OOP metinler basit görevleri overcomplicate bir eğilim var ve benim günlük çalışma küçük projeler ağırlıklı olarak oluşur.

3 Cevap

Bu mimariye bağlıdır. Dört Ortak Veri Kaynağı Mimari Desenler Martin Fowler 's bulunabilir Patterns of Enterprise Application Architecture:

  • Table Data Gateway

    Bir veritabanı tablosuna bir ağ geçidi gibi davranan bir nesne. Bir örnek tablodaki tüm satırları işler.

  • Row Data Gateway

    Bir veri kaynağındaki tek bir kayıtla bir ağ geçidi gibi davranan bir nesne. Satır başına bir örneği yok.

  • Active Record

    Bir veritabanı tablo veya görünümünde bir satır sarar bir nesne, veritabanı erişimi saklar ve bu veriler üzerinde etki mantığı ekler.

  • Data Mapper

    Birbirinden bağımsız ve eşleyici kendisi tutarken nesneler ve bir veri tabanı arasında veri taşır mappers tabakası.

Ek desenler

Eğer Doctrine veya Propel gibi bir nesne ilişkisel eşleme kütüphaneyi kullanarak düşündünüz mü?

Zend Framework quickstart birlikte bazı kaynak kodu ile, models ve mappers (google'able açısından) bir, kavramak oldukça kolay bir bakış vardır.