Ben nesne yönelimli programlama noktası cevapsız?

6 Cevap php

Son zamanlarda, ben OO programlamayı denemek ve öğrenmek için kendimi üzerine aldı. Ben (bana 'kolay' gibi) statik yöntemleri tercih gibi görünüyor, çünkü ben başlayalı yaklaşık 3 ay oldu, ama ben missing the point olabileceğini düşünüyorum.

Örnek

İşte tipik bir DB sorgu benim kod gibi görünüyor.

$bindings = array(':name'=>$articleName);

Db::query('SELECT id, name, title, image, content FROM ' . CONFIG_MYSQL_TABLE_PREFIX . 'articles WHERE name = :name LIMIT 1', $bindings);

Ve ben burada / ürün / cache görüntüleri yeniden boyutlandırmak nasıl

$image = Img::thumbnail($imagePath, 200);

$imgHtml = '<img alt="' . $this->getTitle() . '" src="' . '' . $image['src'] . '" width="' . $image['width'] . '" height="' . $image['height'] . '" />';

Statik yöntemlerin her ikisi de ilk tek tek PDO nesnesi ve ikinci bir Google kod üzerinde bulunan bir ImageResize sınıfını oluşturur oluşturur .. Bir tek deseni kullanmaktadır.

Ben gerçekten nesne yönelimli programlama aramak istedim bu 2 nesne olmalıdır? yani

$db = new Db();

$image = new Image($src, $width, $height);

Her şey için ben bunları kullanmak? Ben bir dosyaya giriş için kullanılan konum sürece singletons da kötü bir fikir olduğunu okudum. Ama bir DB bağlantısı gerektiğinde açılan ve kullanılan ve bitmiş oldu sonra kapalı olduğu için bir tek iyi değil mi?

Benim sorum, ben hala usul zihniyet sıkışmış ve ben bu yüzden eğer, ben kötü bir uygulama olarak kabul ne yapıyorum? Kendimi nasıl doğru OO düşünce kalıpları daldırın olabilir?

Update

Cevaplar için teşekkürler. Ben daha az kod yazıp statik yöntemler küçük uygulama şeyler konusunda endişelenmenize izin var gibi easier olarak yapıyorum orijinal yöntemler bulurum.

Ama başka bir soru kendisi olacaktır dil OO sağlam bir kavrayışa almak için başka bir dile bakacağız.

6 Cevap

Çünkü PHP is not object-oriented Eh, PHP imho bunun için kötü bir örnektir. Evet nesneler vardır. Evet onlar miras ve tüm bu OO ilkeleri desteklemek. Bu nesneleri destekler. Bir fark var.

PHP varsayılan istekleri arasında bir devlet yok çünkü ben söylüyorum. Her tek bir HTTP isteği tamamen hiçbir statik veri istekleri arasında kalıcı olduğu, yani (oldukça ucuz) sıfırdan bir PHP ortamını yeniden olacaktır. Siz "ne oturum verileri hakkında?" Diyebilirsiniz (Ve belki de! '"A ha append) ama o da bir PHP anlamda kalıcı veri değildir. It (genellikle) dosya sisteminde saklanır ve müşteri gönderen bir cookie tarafından anahtarlı bulunuyor.

Neden bu iki şey söz yok?

In "küresel" kapsam C küresel kapsamı gibi değil çünkü, Java, C + + veya bu diğer dillerde istekler arasında devam eğilimindedir çünkü. PHP daha fazla 90s CGI programlama modeli (nerede kökenli olduğunu çünkü hiçbir tesadüf ki) gibidir.

Yani nesneler gerçekten küresel değiller: Geçerli istek hizmet kodunun tüm bölümlerine sadece görülebilir.

Bana göre, bu hiçbir yerde yakın olarak kötü değil. Aslında, sık sık oldukça kabul edilebilir bulabilirsiniz. Bazen (sen arayana geri bilgi göndermek veya () / create_function () kesmek eval yapmadan geri arama için devlet geçmek istiyorsanız preg_replace_callback için bir geri arama gibi) her gereklidir.

Hatta PHP 5 OO özellikleri hala biraz oldukça mutlu hiç onları kullanmadan PHP de uzak ve kod kod olabilir, yani "tacked" çünkü ve PHP nesne değil varlık hakkında noktası oriented olduğunu. Bu yapmanız tüm bu statik yöntemler bir demet yazmak bile bir sınıf oluşturmak zorunda Java, diyelim ki, farklıdır.

Eğer OO öğrenmek istiyorsanız Yani, dürüst PHP bunu yapmazdı. PHP bir çok şey için iyidir ama bir HTTP isteği ömrü için tasarlanmıştır (evet ben size komut satırından çalıştırabilirsiniz biliyorum ama bu kullanıcıların büyük çoğunluğu ne değil) ve bunun için tasarlanmış işinde oldukça iyi .

Nesne yönelimli programlama kavramak için en iyi yolu, nesneler işlevlerini çağıran, birbirlerine mesajlar değil geçen nesnelerin düşünmektir. Ben Smalltalk öğrendim ben bu "eureka" anı vardı.

Bu tür "sormayın söyle" ilkesi ve diğerleri gibi OOP için geçerli ilkeler vardır. bu ilkelere aramak için favori arama motorunu kullanın.

statik yöntemler bolluğu, benim görüşüme göre, bir usul zihniyet sıkışmış olmanın bir göstergesidir. emin orada onlar gerçekten mantıklı senaryolar vardır ama kod örneği yöntemleri daha statik yöntemler varsa ben şeyleri OO şekilde yapmıyoruz söyleyebilirim.

Eğer kolay ana paradigması olarak OOP destekleyen bir dilde daha sağlam fikirleri kavramak bulabilirsiniz ... değil birkaç korkuluk vardır, çünkü php veya perl veya ne olursa olsun, sadece kadar kolay değil bunu yapamaz ve bu teşvikler

dilleri bir kenara, o da şu anda yapıyorsun şeyler tür gerçekten OOP gerektirmeyen durum olabilir; eğer öyleyse, bunu ter başka şeyler OOP ile oynamak istemiyorum.

Ne OO bir zorunluluk ortamda devlet yönetiyor yardımcı olur.

Ben tahmin ediyorum bunun arkasında, öncelikle Db :: sorgu vermek iki örnek almak için bu her yerde yazılım bunu da bulunuyor gelişmekte konum anlamına statik bir yöntem olmakla birlikte, bazı veritabanı bağlantısı:

  • Kilitler yarışma
  • Tk-diş sorunları var
  • Her işlem için veritabanına Reconnecing

Daha sonra düşünebilirsiniz - Ben iki farklı veritabanlarına bağlanmak istiyorsanız ne olur?

Kendinizi sistem gelişmeye nasıl daha fazla kontrol veriyoruz bir nesne olarak Db alarak.

Benzer şekilde küçük nesil ile, sistem size daha iyi yaşam döngüsü üzerinde kontrol ve nasıl paylaşılan konum tanıyor onlarla bir nesne anlaşma alarak minik vb önbelleğe istesin.

Bu gibi nesneler ile çalışarak size yazılım endişeleri ayırabilir ve böylece farklı bağlamlarda yeniden kullanımı parçaları ile sonuna kadar.

Bir şey gibi bir denge gerçekten size OO yeni konum beri ben biraz (veya iki yıl) için denemek ve gerçekten avantaj kazanmak gibi görünüyor ne görmek istiyorum şey bu tür değerini belirler çalıştıkları içinde sadece içerik var deneyimimiz bağlamda bu tür ilkeler aşağıdaki küçük kullanım olduğunu söyler zaman sonra belki bağlam değiştiğinde onları sadece dikkatli takip etmeyi.

PHP İlişkisel Veritabanı daha OO hakkında bilgi edinmek için daha kötü bir şekilde hayal mücadele. Birkaç diğerleri PHP ile sorunları belirtmiştik. Ben Nesneler ve İlişkiler karışmaz neden tartışırken siz değerli kurucusu tarafından bir makaleye işaret edeceğiz:

Object-Relational Mapping is the Vietnam of Computer Science

Siz Python GUI programlama gibi bir şey denemek için daha iyi yapardı. Bunun için iyi bir destek var, ancak OO zorunlu değil, çünkü Python tavsiye, o yüzden uygunsuz olduğu OO durumlarda kullanılan görmek için daha az olasıdır. GUI programlama OO teknikleri olmadan neredeyse imkansız çünkü GUI programlama öneririz.

Ben bunu kullanarak uğruna Ö.Ö. kullanmayın. Ben küçük bir program yazmak zorunda kalırsanız ben prosedürel yaklaşımı tercih ederler. Küçük şeyler Ö.Ö. kullanarak sadece sorunu karmaşık hale getirebilir ya da olmasa bile yine de prosedürel yaklaşım üzerinde bir avantaj sayılmaz.

Ama biz emin şey farkında olun ve OO gerçek gücünü kullanmak için iyi bir sınıf diyagramı ve tasarım yapmak çok varlıkları içeren daha büyük bir sorun bakarak eğer. Kullanım OO zaman gerekli yerlerde; sadece onun uğruna küçük sorunları Ö.Ö. geçerli değildir.