Bazı kod gözden?

5 Cevap php

Bu akşam PHP bazı OOP öğrenmek ve bir tuğla duvara vurmak için yedek biraz zaman vardı. Ben kitap koleksiyonu izlemek için küçük bir kütüphane uygulaması oluşturma ve uygulama için OOP kullanmak düşündüm duyuyorum.

Ben şimdiye kadar 2 ana sınıfları içeren library.php adında bir ana php dosyası var.

  1. sınıf veritabanı (MySQL, veritabanı vb bağlanır)
  2. sınıf kitapları (db veri eklemek içerir, başlık, yazar, tür bilgileri vb ve yöntemler)

So, my questions:

Benim sınıfların tümü için tek bir dosya kullanmak için Tamam mı?

Ve aşağıdaki kodu, db kitap katacak süreç sayfası bu Tamam mı ya da ben yanlış yöne gidiyorum?

Ayrıca, nasıl bir sınıfa yeni yöntemler oluşturmak veya tamamen yeni bir sınıf oluşturmak için zaman bilerek gidiyorsun?

  <?php 
    include 'library.php';

    // Connect to Host & DB
    $database = new database();
    $database->mysqlConnect('localhost', 'root', '');
    $database->selectDB('books');

    // Retrieve Values
    $book = new books();
    $book->retrieveValues();
?>

thanks, Keith

5 Cevap

Bence bu dosya sınıftan sonra adını her sınıf için bir dosya oluşturmak için iyidir. i chad huş biraz farklı bir gösterim kullanmak, yani bir Classname.class.php. sınıf autoloading güzel bir özellik, ama (aynı tip sınıflar eklenir veya genellikle kaldırılır MVC gibi, sadece belirli şartlar altında) çok sık kullanmayın.

nesne modelleme ile ilgili: isimler için sınıflar oluşturmaya başlayabilirsiniz. uygulamanızda aktörleri belirlemek. Bunu yapmanın bir yöntem uygulama, mutlaka o isimler için tarama ve bu sonra sınıfları modelleme gerekiyordu ne yazmak için. Bir sınıf, tek bir nesneyi temsil olduğundan, sınıf namens çoğu zaman tekil vardır. Birden fazla nesne varsa, bunu isim olmalıdır ObjectCollection ya da bunun gibi bir şey (örneğin "BookCollection").

Bunu deneyin sağlar:

Ben kitap koleksiyonu izlemek için küçük bir kütüphane uygulaması oluşturmak istiyorum. Bu i, kendi kitapları izliyor tür, yazar (lar) ve arkadaşlar ben onları ödünç gerekir. Ayrıca, her arkadaşınız için telefon numarası saklanmalıdır, bu yüzden onu arayabilirsin. Bütün bilgiler bir veri tabanında depolanır.

  1. Kitap: bir kitap ("Baba", "Cryptonomicon") temsil
  2. Kütüphane: Kitaplar topluluğu temsil
  3. Koleksiyon: Zaten Kütüphanesi tarafından örtülü
  4. Tür ("Sci-fi", "Thriller", ...)
  5. Yazar ("Neal Stephenson", "Mario Puzo")
  6. Friend ("Joe", "Jill", "Jack")
  7. PhoneNumber (bir arkadaş bir özellik)
  8. Veritabanı (duh)

o zaman hiyerarşi oluşturmak. nesneler diğer nesneleri ihtiva eden, bunlar arasında nasıl bir ilişki benziyor?

  • Kütüphanesi, 0, 1 veya daha fazla Kitapları içeriyor
  • Kitap tam bir Tür aittir
  • Bir Kitap 1 veya daha fazla Yazarlar tarafından yazılır
  • Ben bir anda 0 veya 1 Friend ve sadece bir arkadaşınıza bir kitap ödünç olabilir
  • Arkadaşını bir telefon numarası vardır

(Bu da size veritabanı gibi görünmelidir nasıl bir iki şey söyleyeceğim)

her şey açıktır. Eğer gerçekten bir telefon numarası sınıf gerekiyor? sadece bir dize var. Bu durumda, bunu bir özellik yapmak gerekir. Ayrıca telefon numaraları gerçekten (birkaç arkadaş birlikte yaşayan aynı sayıda olan ve sık sık değişir eğer mantıklı olur, ama şimdilik bu biraz abartılı olur) Friend nesneler arasında paylaşılmaz. isim bir skaler değer (bir dize, tamsayı, float) ile temsil edilebilir ve onlara bağlı diğer değerler varsa, bu sınıfları yapmak için overkill olabilir.

böylece, zamanla uygulamanızı uzatmak. Eğer telefon numarasını, ama aynı zamanda adres değil sadece saklamak için karar verdi. adres ve telefon numarası bilgileri oldukça benzer türleri vardır, bu nedenle bunu sokak, şehir, posta kodu için diğer değişkenleri eklemek. Arkadaş sınıfı özelliklerinin çok, alıcılar ve belirleyiciler-yöntemlerle, büyük büyüdü, çünkü belli bir noktada sinirli alırsınız, bazı kişiler grubuna öneki onları birlikte (Arkadaş-> addressStreet, Arkadaş> vb addressPostCode ve) . bu nedenle sadece temiz kod tutmak için, ya da İletişim (eğer Arkadaşına telefon numaranızı bırakırsanız) Adres adında bir kendi sınıfı için bu, taşınmaya (bu yanlış bir şey, ama dikkatli olmak) karar verebilir.

ne sınıf hiyerarşisi ve nesne hiyerarşisi hakkında? onları karıştırmayın, onlar tamamen farklı şeyler! benzer sınıflar bazı özellikleri paylaşır ama diğerlerinde farklı ise bir sınıf hiyerarşisi ortaya çıkar. böylece özellikleri ve yöntemleri paylaştıkları ve özellikleri ve ebeveyn yöntemlerini miras alır çocuk sınıflar ile bir sınıf oluşturmak ve aynı zamanda farklılıkları işlemek için kendi ekleyin.

in our library example, what could that be? to be honest, i can't think of anything besides one thing thats a bit nonsensical, but let's go for it ... Friends and Authors are both Persons! both have names, phone numbers and an address. but they also differ, because authors write books and friends don't (and authors normally don't borrow your books). so you might define the name and Address-object in the Person class, but "getUnreturnedBooks()" clearly belongs to Friend while "getBooksWritten()" belongs to Author.

Eğer aynı vadede Yazarlar ve Arkadaşlar işlemek için asla çünkü gerçekten mantıklı değil. ama size Kişilerin sizin toplama üzerinde döngü ve getAddress () diyebiliriz, kitaplığınızda depolanan tüm adresleri listesini gerekli Diyelim ki. Dürüst olmak gerekirse, bir dizide birlikte istersen türleri saklamak ve istediğiniz her şekilde erişebilirsiniz bile, çünkü PHP, bu kötü bir örnek olduğunu, ancak stronly yazdığınız dilde bu mümkün değil. java bir dizi için bir veri türü tanımlamak zorunda ve onlar ortak bir miras var (ama özgün sınıf vardı yöntemlerle sınırlı konum) eğer farklı saklamak mümkündür. bu sınıf miras voodoo yeterli.

Bir nesne hiyerarşisi sadece nesneleri diğer nesneler içermelidir hangi devletler. Bir kütüphane kitap nesneleri içerir. Bir kitap bir yazar nesne içerir.

bazı ek noktalar:

  • açıklayıcı olmaya çalışın. "Kütüphane-> getBooks ()" Kitap nesneleri çünkü yerine, ne olsun bu isim, "Kütüphane-> retrieveValues ​​()" gibi isimleri kullanmayın.

  • bazen onlar dönmek için gidiyoruz veri türü sonra yöntemleri adına iyi bir fikirdir. onlar booleans dönerseniz o ortak. iyi adlandırmasında veya "Arkadaş-> hasBook ($ kitap)" ya da "Kitap-> isInLibraryCurrently ()" gibi "olan" "vardır" olabilir

  • Belirli bir sınıfın tüm nesneler için her zaman aynı değerleri sınıf sabitler olabilir. Bir kişi erkek veya kadın olabilir eğer, demek sağlar ve veritabanında "m" veya "f" olarak, bu anlamda sınıfını tanımlamak yapar saklıyorsanız Kişi sabitleri :: GENDER_MALE = 'm' ve Kişi :: GENDER_FEMALE = 'f', sen her yerde sizin sql sorguları dağınık "m" ler ve "f" ler yok yani.

  • Yalnızca tek bir örneğini oluşturmak Sınıflar Singletons olarak modellenmiştir olabilir. Bunun için iyi bir örnek veritabanı sınıfı olabilir - bu size hiç bir seferde birden fazla işlem açmak için gereken son derece unlikley bulunuyor. wikipedia (http://en.wikipedia.org/wiki/Singleton_pattern) de tekiz hakkında daha fazla okumak, ama biraz erken olduğunu için olabilir.

Güncelleme: Bazı insanlar onları bu şekilde uygulamak kez "taş oyma" daha fazla ya da daha az çünkü Singletons, kötü bir fikir olduğunu düşünüyorum. Eğer bir singleton olarak Veritabanı sınıfı modellemek, ama daha sonra birden fazla veritabanı bağlantısı (unlikley, ancak olası) gerek karar eğer öyleyse, bir sorun var. Eğer risk almak, singletons uygun olabilir.

Üzgünüm, (Ben bu yarın sabah geri gelebilir) anda tüm soruları için vaktim yok, ama hızla İlkini cevap verebilir:

Benim sınıfların tümü için tek bir dosya kullanmak için Tamam mı?

Bunu sağlayacak dil gibi, teknik olarak "Tamam", ama olmamalıdır. Kodunuzu organizasyon iyileştirilmesi yararların ötesinde, aynı zamanda Autoloading Objects olarak bilinen PHP güzel bir özellik kullanmanızı sağlar.

Eğer örnek, sayfa gösterileri takip ederseniz aşağıdaki gibi __autoload fonksiyonunu tanımlayabilirsiniz:

function __autoload($class_name)
{
    require_once $class_name . '.php';
}

Eğer explicity sınıf tanımları ile tüm dosyaları eklemek zorunda değilsiniz, böylece bu yapar. Ihtiyaç duyulan Bunun yerine, sürece sınıf adıyla aynı adlı dosyalarına koymak, autoloading dosyaları otomatik olarak yer alacak. Bu sizin kod size "kitap" adlı bir sınıf var olduğunu göstermektedir vardır. Eğer gibi bir kod satırı var "books.php", adlı bir dosyaya bu sınıfın tanımını kaydetmek eğer:

$book = new books();

PHP otomatik olarak bu noktada books.php içerecektir. Bu çok kullanışlı ve kendi dosyasında her sınıf tutmak için kesinlikle iyi bir motivasyondur.

A sınıfı fonksiyonları ve özellikleri bir koleksiyon. Eğer yapılması gereken belirli bir eylem gerekiyorsa, o zaman yeni bir işlev oluşturmak. Bunun üzerine yapılan farklı eylemlerin bir grup veri tek tip ihtiyacınız varsa, yeni bir sınıf oluşturmak.

Ben MySQL kullanarak görüyorum beri, sen hazır deyimleri (http://us2.php.net/pdo.prepared-statements) güvensiz kod önlemek için kontrol etmelisiniz.

PS: Ben class "kitap" adını alacağını ve "kitaplar." Bu ilan edilir şekilde düşünün - new books()? Sen one yeni kitap oluşturarak, bu yüzden new book() daha uygun görünüyor demektir.

Ben OO programlama fikri parçası muhtemelen ayrı bir dosyası içine her sınıf ayırmanız iyi olurdu böylece sınıfları ve mantık ayrılmış olduğunu düşünüyorum. Bir sınıf veya yeni bir sınıfın yeni bir yöntem oluşturmak için zaman gelince, ben kullandığınız yöntem, bu özel sınıfın ana faaliyetleri ile ilgisi yoktur eğer ilave gerektiğini düşünüyorum. Sadece Rutin veya önemli işlevleri gerçekleştirdiğinde yeni bir sınıf yapmak, ve sağ sınıfta doğru mantığı tutmak.

Eğer düşünmek olabilecek bir diğer şey zaten yazılmış bir veritabanı kitaplığı kullanıyor. Programlama ve özellikle OOP hakkında en iyi şeylerden biri, farklı bir bütün oluşturmak için parçaları yeniden yeteneğidir. Şahsen ben kullandım ADODB mükemmel sonuçlar. Ben autoloading için ve kafanızda onları ayrı tutmak için hem de, ayrı dosyalarda sınıfları koyarak katılıyorum. Burada üzerinde sınıfların bir kopyasını gönderme sakıncası yüzden biz onlardan iç işleyişini ve sadece yöntem adları daha iyi bir görünüm elde edebilir?