Bir braindead n00b için OO PHP açıklama

9 Cevap php

Şimdi yaklaşık altı yıldır PHP yazıyorum ve ben iyi kod yazmak için daha fazla çaba gerektiğini hissediyorum bir noktaya var. Ben Object Oriented kod gitmek için yol olduğunu biliyorum ama ben kavramı etrafında başımı alamıyorum.

Herkes herhangi bir aptal anlayabileceği, OO açıklamak ve nasıl PHP çalışan ya da beni bir salak rehber öğretici işaret edebilir?

9 Cevap

Ben ayakkabı olmuştur, ama ben bu okuyun sonra http://www.apress.com/book/view/9781590599099, ben gerçekten "var" ve ben geriye bakmadım bu kitabı (bir kaç kez!) Okuduktan sonra ben ışığı gördüm. Sen Amazon üzerinde alırsınız.

Ben, sen inat umut olsun, ve onu seviyorum. Birlikte geldiğinde, smile yapacaktır.

Kompozisyon mirasımızın yener.

Bir zımbırtısının düşünün. Herhangi bir zımbırtı, size bir şeyler yapmak istediğiniz bir zımbırtı. , Kahvaltı söylüyorlar.

(Tüm kodu herhangi bir dil yaşayan, ölü ya da klinik olarak bankacılık sektöründe istismar ediliyor için herhangi bir benzerlik tümüyle rastlantıdır ve yazı ile ilgisi PHP yadsınacaktır, pseudocode)

Yani bir kahvaltı temsil ediyorum nasıl bir şablon tanımlamak. Bu bir sınıf:

class Breakfast {

}

Kahvaltılar özelliklerini içerir. Normal olmayan nesne yönelimli şeylere, bunun için bir dizi kullanabilirsiniz:

$breakfast = array(
'toast_slices' => 2,
'eggs' => 2,
'egg_type' => 'fried',
'beans' => 'Hell yeah',
'bacon_rashers' => 3 
);

Ve onunla uğraşmaktan için çeşitli işlevleri olurdu:

function does_user_want_beans($breakfast){
     if (isset($breakfast['beans']) && $breakfast['beans'] != 'Hell no'){
         return true;
     }
     return false;
}

Ve bir karmaşa var, ve sırf fasulye ettik. Sen programcılar irade, kahvaltı yapmak için fonksiyonları giderek genişleyen koleksiyon tamamen verilerin tanımı boşanmış ile vida bir veri yapısı var. Peki yerine, bunu yapmak isteyebilirsiniz:

class Breakfast {
  var $toast_slices = 2;
  var $eggs = 2;
  var $egg_type = 'fried';
  var $beans = 'Hell yeah';
  var $bacon_rashers = 3;

  function wants_beans(){

     if (isset($this->beans) && $this->beans != 'Hell no'){
         return true;
     }

     return true;

  }

  function moar_magic_pig($amount = 1){

     $this->bacon += $amount;

  }

  function cook(){
      breakfast_cook($this);
  }

}

Ve sonra Kahvaltı programın fikrini manipüle çok temiz olur:

$users = fetch_list_of_users();

foreach ($users as $user){
    // So this creates an instance of the Breakfast template we defined above

    $breakfast = new Breakfast(); 

    if ($user->likesBacon){
       $breakfast->moar_magic_pig(4);
    }

    // If you find a PECL module that does this, Email me.
    $breakfast->cook();
}

Ben bu temiz görünüyor düşünüyorum, ve veri lekeler temsil eden bir çok kıvrımlara yolu biz tutarlı bir nesne olarak tedavi etmek istiyorum.

Orada OO aslında ne olduğunu daha iyi açıklamalar vardır ve neden akademik iyidir, ama bu benim pratik bir nedeni olduğunu ve pastırma içerir.

Bir uyarı yer almaktadır: Eğer OO tasarım öğrenme olmadan OO programlamayı öğrenmek değil! Anahtar kavram birbirine uygun veri ile veri üzerinde işlem işlevleri tanımlamak için. Sonra bunların içeriğini sorgulamak zorunda kalmadan, tell sizin nesneleri yapmak ne.

Şüphesiz çok, "Tell, don't Ask" felsefe okuyun, önceki ve ("Demeter Kanunu" aka) çok önemli biri "bilmesi gereken" prensibi alır.

Ben okuma tavsiye Code Complete. PHP OO üzerinde birkaç bağlantıları büyük, ancak bu fikrin ekmek ve tereyağı alır.

OO biz insanlar algılamak ve şeyler ilişkilendirmek gibi nasıl benzer şekilde kod yapısı vardır kullanın ve economy, {[yararları yararlanmak için önemli nedenlerinden bazıları ( 2)]}, reliability ve scalability.

yani: İnsanoğlu yıl önce tekerlek binlerce tasarlanmıştır. Biz bunu her zaman rafine olabilir, ama biz kesinlikle tekrar yeniden icat edilmesi gerekmez ....

1) Biz gibi categorise şeyler: "Bu kişinin bu daha büyük", "bu bir o birden fazla maliyeti", "bu bir neredeyse o biri olarak aynıdır".

Tamam, bu bir V8 sıvı turbo tahrik traktör soğutmalı var ", ama hala sadece direksiyonu çevirmek ve onu götürmek için peddles ayaklarımı basın: 2) Biz simplify gibi şeyler değil mi? ".

3) Biz gibi standardise şeyler: "Tamam, üçgenler, daireler, kareler ve tüm BİÇİMLERE diyelim, ve hepsini bir alanı ve çevresi olmasını bekliyoruz."

4) Biz adapt gibi şeyler: "hmmm, ben öyle, ama ben bunun yerine Racing Green içinde olabilir?".

5) Biz yaratmak için blueprints gibi: "Ben zaman ya da para (veya onayı) var değil henüz inşa etmek, ancak bir kapı ve bir çatı OLACAK, ve bazı pencere ve duvarlar ".

"! Tamam, ben size toplam fiyatı görmek, ama ben sizden eklenen mark-up saklıyorum izin vereceğim": 6) Biz protect gibi şeyler.

7) Biz communicate birbirleriyle gibi şeyler için: "Ben ile benim banka denge erişmek istiyorum: benim cep, benim bilgisayar, ATM, bir banka çalışanı, vs.".

Ö.Ö. yararlanma (ve bazı avantajlar bakınız) öğrenmek için o zaman ben size ev ödevi olarak kendinize bir egzersiz seti öneririz - örneğin daireler, dikdörtgenler ve üçgenler gibi şekiller ile uğraşan ve kendi alanında izler belki bir tarayıcı tabanlı bir uygulama, bunun tanımı, alan vb çoğu ilgili olarak aynı olduğu için, vb renk, konum, ve z-index O dikdörtgen özel bir durum olarak kareler eklemek sadece yüksekliğinin genişliğine eşit olan ilave hastalığa sahip . Zor yapmak için o zaman bir dikdörtgen çokgen türüdür dörtgen bir tür yapabilir. vs vs

NOTE: Ben ilk OO programlama temelleri ile rahat edene kadar bir PHP Framework kullanarak başlamak olmaz. Onlar o zaman biraz ezbere bir şeyler öğrenme gibi değil eğer ve kendi sınıfları uzatabilirsiniz zaman çok daha güçlü -> çok zor!

^ ^ ^ ^ Xtofl.myopenid.com: iyi tavsiye oldu

Eğer desen amaçlarını anlamak yoksa, senin gerçekten sonuna kadar nesneleri kullanmak için gitmiyorum. Sen kalıtım, polimorfizm, arayüzler, fabrikalar, dekoratörler, vb gerçekten belirli konuları ele daha kolay tasarım yapmak neden bilmek gerekir.

Bunun yerine sıfırdan OO öğrenme, sana nesne yönelimli programlama kolaylaştıran bir çerçeve aldı eğer daha kolay olacağını düşünüyorum. Bu doğru OOP yöntemleri kullanmak için "zorlamak" olacaktır; Eğer çerçeve iyi OOP yapmak olarak nasıl yazılır şekilde öğrenmek mümkün olacak.

Ben QCodo PHP5 çerçeve tavsiye ederim http://www.qcodo.com. Bu büyük kurmak için nasıl video eğitimlerini, hem de video eğitimler var (http://www.qcodo.com/demos/).

Tam açıklama: Ben iki yıldır bu çerçevede üstüne gelişmekte oldum, ve ben onların kod temeli kod katkıda ettik (yani ben tamamen tarafsız :-) değilim).

Öğrenme OO için başka bir işaretçi:

Çoğu OO öğreticiler (örneğin sınıf X sınıfı Y uzatır) miras üzerinde durulacak. Ben bu kötü bir fikir olduğunu düşünüyorum. Kalıtım yararlıdır, ama aynı zamanda sorunlara neden olabilir. Daha da önemlisi, miras OO noktası değildir. Nokta soyutlama değildir; Eğer basit bir arayüz ile çalışmak, böylece uygulama ayrıntılarını gizleme. Verilerin iyi soyut yazmayı öğrenmek ve iyi durumda olacak. Hemen miras şeyler ter etmeyin.