OO PHP yeniden kullanılabilir yapılarının açıklanması

4 Cevap php

Can someone please explain "re-usable structures" for me? I was working on making some db objects in php, but was told I was using too much processing from the computer cause I made stuff to complicated with the below objects:

Benim DB nesneleri:

$db = new Database;
$db->db_connect();

$post_content = new DbSelect;
$post_content->select('id', 'title', 'firstName', 'created', 'catName', 'tagName');
$post_content->from('content');   
$post_content->join('inner');
$post_content->on('category','cat_id','id');
$post_content->where('id','1');
$post_content->order('created');

$db->db_close();

Normal PHP:

mysql_connect();
mysql_db_select();

$query = 'SELECT id, title, s_name, created, cat_name, tag_name
                FROM content
                JOIN INNER category, cat_id, id
                WHERE id=1
                ORDER created';

mysql_close();

So to reiterate my questions: 1. A quick explanation of re-usable structures? 2. why is the first method using objects "wrong"?

please note: I'll be googling this as well as hoping for feedback I know there a "tools" like Zend and other's that have plenty of db objects built into them, but I'm trying a DIY approach

4 Cevap

Bu sefer nereden başlayacağınızı emin değilim. Object Oriented tasarım önemsiz bir konu değildir ve yanlış gidebilirsiniz birçok yolu vardır.

Esasen, size aynı arayüzü ile diğer modüller için onları dışarı takas edebilirsiniz şekilde uygulamanızda mantıksal indepedent nesneleri yapmak, ya da gelecekteki projelerde onları yeniden denemek istiyorum. Veritabanı örnekte, ARMUT bakmak :: mdb2. Eğer kullanmakta olduğunuz özel veritabanı hakkında endişelenmenize gerek kalmaması ARMUT :: MDB2 uzak uygulama veritabanı sürücüleri soyutlar. Bugün, sitenizde çalıştırmak için MySQL kullanıyor olabilirsiniz. Yarın, Postgresql geçiş olabilir. Eğer uygun bir OO tasarım kullanırsanız İdeal, o iş yapmak için kod herhangi bir değişiklik gerekir shoudn't. Sen sadece başka bir veritabanı katmanı takas gerekir. (Pear :: MDB2 db bağlantı dizesi değiştirmek bu kadar basit yapar)

Ben Steve McConnell tarafından Complete Kodunu okuma önerebilir. Sınıflar üzerine bütün bir bölüm var. Örnekler, esas olarak C + + da, PHP kavramları da dahil olmak üzere herhangi bir programlama dili, uygulanabilir.

Karıştırmayın nesne yönelimli-programlanmış "class odaklı" ya da "nesne tabanlı" programlama ile. Her ikisi de, yüzeyinde, OOP gibi görünür ama değildir olabilir.

Bunlar yapısal kodunu almak ve sınıfları bir demet sarın zaman vardır, ancak bu faaliyet nasıl temellerini değiştirmez. Aklınızda nesnelerle programlayabilir, ama sen OOP (polimorfizm, toplama, saklama, vb) tanıyor özel sözleşmelerin herhangi bir kaldıraç değil ne zaman. Bu OOP değil.

Ne may Burada var kod bu tip bazı olduğunu. Bunu söylemek biraz zor. Eğer sorguları yeniden yazmak zorunda kalmadan herhangi bir veritabanına bağlanmak kullanın böylece ham SQL kod uzak soyut için DbSelect sınıfının amacı, var mı? (Gibi birçok DBal çözümleri yapmak alışkanlık) Yoksa bunu yapıyor "sırf" Eğer yöntem çağrıları bir zincir haline temel bir SQL sorgusu döndü çünkü OOP elde ettik gibi görünmek için bir çaba? İkinci sınıfların bu seti oluşturmak için motivasyon yakın ise, muhtemelen ilk etapta bu sınıfları ve nesneleri neden yapıyoruz düşünmek gerekir.

Ben sizin basit parçacığını tarafından ne söyleyebilirim, aslında yeniden kullanılabilirlik şekilde burada şey kazanmış değil, dikkat etmelisiniz. Şimdi, tasarım ben onu göremiyorum esneklik verir kod içerebilir, ancak tür orada olmadığını sanıyorum. Prosedürel / yapılandırılmış pasajı gerçekten daha fazla veya daha az yeniden önerdiğiniz sınıf tabanlı olandan.

Kiminle konuştuğunu bir nokta vardır - bir kompleks (ya da hatta basit) cepten çözüm geliştirme kesinlikle birçok faydaları olabilir - ama bu faydaların maliyeti bakılmaksızın bunu (ve always bir maliyet var) aptalca, en iyi ve en kötü tehlikeli olduğunu.

Bu çözüm "normal" yolu olarak aynı şeyi elde etmek için daha fazla yazmaya gerektirir gibi görünüyor. Dize SQL nesne için bellek ayrılırken daha verimli olacaktır.

Eğer sadece bir seçme daha fazla özelliklere sahip bir veri soyutlama katmanı oluşturmak istiyorsanız Active Record desen kontrol etmelisiniz.

Eğer karmaşık Formlar sorgular oluşturmak için DbSelect nesneleri kullanıyorsanız, o zaman doğru olanı yapıyoruz.

Query Object pattern