Genel bir sınıf bir site PHP sitesi için gerekli midir?

3 Cevap php

Ben sadece benim belirli bir site, yani ilgilidir CORE sınıf var, bu alana özgü işlevleri gerçekleştirir. Ben (mysql için) bir veritabanı sınıf var, ve erişim, validator, yükleme, şablon vs vs gibi diğer sınıfları .. php sınıfları sadece bu yüzden hemen hemen tüm sınıfların veritabanı sınıfını genişleten, her biri sınıfını genişletebilirsiniz biliyorum. Ben twitter API kullanılan bir kamu twitter sınıfı üzerinde bakıyordu. İçinde, web sitesi, insert, silme, doğrudan giderek yapabileceği hemen her şeyi yapmak için fonksiyonlar vardır neyse ... benim Core sınıf içinde tüm site Relatie fonksiyonları koymak ve benim komut genel kapsamı dışında tutmak mı . Şu anda böyle bir şey var ....

İşte bir örnek, şu an itibariyle ben gibi işlevlere sahiptir

$core = new Core();
$core->get_user_info($user_id);
$core->get_user_articles($user_id);

Bu fonksiyonu içerisine, i dağınık alabilirsiniz beri doğrudan yapmak zorunda kalmazsınız böylece gerekli bilgileri seçmek için veritabanı sorguları gerçekleştirmek.

Ben de benzeri şeyleri silmek işlevlere sahip

$core->Delete_Article($article_id);

Ancak, ben eklemek işlevleri yok. Bunun yerine şöyle, bilgi eklemek için doğrudan veritabanı sınıfını kullanın.

$article = array(user_id => $_SESSION['user_id'], body => $_POST['body']);
$db = new Database();
$db->Insert($article, 'articles');

veya

$user = array(name => $_POST['name'], email => $_POST['email']);
$db->Insert($user, 'users');

Şimdi, diğerinden bir yönü ayrılığı konu, select / ekleme / güncelleme / benim genel CORE sınıf içinde sorguları silmek ve arka planda TÜM veritabanı eylemleri yapmak benim veritabanında TÜM koymak gerekir

Like instead of $db->Insert(), i could use $core->insert_user() veyajust continue as I'm doing.

3 Cevap

Bu insanlar için oldukça yaygın bir hata yeni nesne yönelimli programlama. Bunu size gereken bazı fonksiyonlara sahip sırf bir sınıf uzatmak istemiyorum. Aslında, sen başladık yaparken de bütün sınıfları uzanan kaçınmak isteyebilirsiniz. OOP en tanıtımlar miras dışında büyük bir anlaşma yapmak olsa da, ben şu an için sakınmak olacaktır.

Bunun yerine, onlar alıştığınız şekilde açısından nasıl yapabilirsiniz grup birlikte fonksiyonları düşünüyorum. Örneğin, kullanıcıları yönetmek söylüyorlar. Sen bu gibi sınıflar oluşturabilir vs, bunları silmek, kullanıcı eklemek, kullanıcı bilgilerinin takip etmek gerekir:

class User {
  function getName()...
  function getID()...
}
class UserAdmin {
  function addUser(User $user)...
  function getUser($id)...
  function deleteUser($id)...
}

Bu sınıflar aramak gerekir hangi işlevleri göre değil, kavramlara göre düzenlenmiştir.

Eğer do veritabanı erişimi gibi şeyler için yeniden işlevleri gerektiğinde, genellikle başka bir ayrı nesne işi isteyeceksiniz. Yani bunun yerine SQL biçimlendirmek için UserAdmin sınıf extend bir veritabanı sınıfı sahip:

// wrong
class UserAdmin extends Database {
  function getUser($id) {
    $this->openConnection();
    $this->runQuery("select * from users where id = {1}", $id);
  }
}

... Eğer UserAdmin sınıf içinde sadece use Veritabanı sınıfı yapabilirsiniz:

// right
class UserAdmin {
  function getUser($id) {
    $db = new Database();
    $db->openConnection();
    $db->runQuery("select * from users where id = {1}", $id);
  }
}
class Database {
  function openConnection() ...
  function runQuery() ...
}

Başlangıçta fazla iş gibi görünebilir, ancak bağımsız çeşitli sınıfları tutar. Yani, yazmak korumak ve test etmek için onları kolaylaştırır.

PHP yüklenmesi Çünkü everything her sayfa görünümünde, her şey için sınıfları instanciating çok avantaj görmüyorum. Eğer kabaca coorspond veritabanı şeması olan dosyaların içine işlevini kırarsanız, büyütmek ve yukarı her sayfa hit yüklenen daha fazla işlevleri eklemeden yapabilirsiniz.

Eğer onlarca veya tablolar / sınıfların yüzlerce var bu konularda.

Özellikle PHP için, biz bu tarzı tercih:

class Member
{
    public static function Insert($aData)
    {  
        //Insert member and return ID
    }
    public static function Select($Member_ID)
    {  
        //select member and return Array
    }

    public static function List($aFilter)
    {  
        //Return list of members filtered by specific criteria
    }
}


Bir adım daha ileri götürün, biz ilgili "singletonish" değişkenleri tutan App, statik bir sınıf var.

class App
{
    public static $DB = NULL;
}

App::$DB = new Connection();

Şimdi, her yerde app, size söyleyebilirim:

App::$DB->Query(...);

Genellikle, ne yapmam sadece SQL bir argüman alır benim veritabanı sınıfının basit bir sorgu () yöntemi ekleyin. Sonra belirli bir sınıfın, soyut bütün genel CRUD yöntemleri. Eğer bir Makale sınıf varsa, bu yüzden deleteArticle () yöntemi, bu sınıfta gitmek istiyorum, ve veritabanı sınıfı ile Madde sınıfı genişletir. Bu sınıf içinde $ db-> query ($ sql) kullanın. ve böylece diğer sınıfları ile ...