Neden PHP Temel İşlevleri üzerinde OOP ve ne zaman?

8 Cevap php

Orada bu konuda bazı mesajlar vardır, ama Object Oriented kodlama ve ne zaman dahil programlı işlevleri kullanmak için kullanmak zaman açıkça alamadım. Biri de OOP çalıştırmak için çok ağır olduğunu ve daha fazla iş yükü yapar bana bahsetti. Bu doğru mu?

Ben 50 fonksiyonları ile büyük bir dosya var Diyelim ki, neden ben bir sınıf bu aramak isteyeceksiniz? değil işlev_adı tarafından (). Ben geçiş ve benim tüm fonksiyonları tutan bir nesne oluşturmak gerekir? Ne avantajı ya da belirli bir fark olacak? Bu php kod OOP ne fayda sağlar? Modülerlik?

8 Cevap

Senaryoları bir sürü olarak, prosedürel programlama gayet iyi. Bunu kullanarak uğruna Ö.Ö. kullanarak sadece POD nesnelerin (düz-eski-data) ile sonuna kadar gidiyoruz, özellikle eğer, işe yaramaz.

OO gücü kalıtım ve polimorfizm esas gelir. Eğer sınıfları kullanabilirsiniz, ancak bu iki kavramın birini kullanmak asla eğer, muhtemelen ilk etapta bir sınıf kullanarak gerekmez.

OO parlar IMO o güzel yerlerden biri, sen açma-tipi kod kurtulmak için izin veriyor. Düşünün:

function drive($the_car){

  switch($the_car){

    case 'ferrari':
      $all_cars->run_ferrari_code();
    break; 
    case 'mazerati':
      $all_cars->run_mazerati_code();
    break; 
    case 'bentley':
      $all_cars->run_bentley_code();
    break; 

  }

}

onun OO alterantive ile:

function drive($the_car){

  $the_car->drive();

}

Polimorfizm zamanı bilgilere dayanarak, gerçekleşmesi için "itici" uygun türü sağlayacaktır.

Bir programda bir nesne yönelimli programlama yaklaşımı yerine bir prosedürel programlama yaklaşımı kullanarak gerçekten (PHP veya olmamak) diline bağlı değildir, ancak sorunun türüne çözmeye çalışıyoruz.

(Ben sadece PHP ile çok aşina değilim benim örneklerde pseudocode kullanmak için gidiyorum.)

Eğer sadece sırayla fonksiyonları bir sürü performans bir program varsa, örneğin, daha sonra usul ince olacak. Örneğin, basit bir dize işleme programı ise, bir prosedürel yaklaşım yeterli olacaktır:

perform_truncation(my_string, 10)
to_upper(my_string)
perform_magic(my_string, hat, rabbit)

(Örneğin dosyaları gibi, ya da diğer herhangi bir temsil, iyi, nesneler) birçok farklı öğeleri ile başa çıkmak için gidiyoruz, ancak daha sonra bir nesne yönelimli yaklaşım daha iyi olurdu.

Eğer Car s bir grup vardı ve drive onları istedim Örneğin, daha sonra usul içinde, size hat boyunca bir şey yapabilir:

drive_car(first_car)
drive_car(second_car)

Nerede OOP'deki, Car kendisini sürücü, gibi:

RedCar myRedCar();
BlueCar myBlueCar();

myRedCar.drive();
myBlueCar.drive();

Her araba farklı bir sınıf olarak ve, davranışları farklı tanımlanabilir. Ayrıca, her ikisi de alt sınıfları olabilir veya Car ortak özelliğe sahip olabilir.

Gerçekten aşağı daha prosedürel yaklaşım da iyi yapar sorunun türüne gelince nesne odaklı ve tersi.

Kenara usul veya nesne yönelimli sayısından, birçok fonksiyonları ile bir kaynak dosyası var "kod koku" bir tür olabilir. Bu da daha iyi ayrı sınıflarda ayrı fonksiyonlar olarak yapılabilir birçok işlevleri içeren sınıfları hakkında söylenebilir.

Burada sorun, daha doğrusu usul veya nesne yönelimli programlama almak için karar daha kod organizasyonu olabilir. Ayrı kaynak dosyaları içine fonksiyonlarını organize programı yazmaya usul yaklaşımı terk etmek burada daha gerekli ne olabilir.

Sonuçta, iyi yazılmış ve bakımı kolay olan prosedürel programlama yaklaşımıyla yazılmış programları bol vardır.

Ben Majd Taby ve Coobird tarafından cevaplar gerçekten çok iyi, çünkü ek olarak benim cevap tutmaya çalışacağım.

Ben bir takım çalışma ve daha önemli ve karmaşık projeleri inşa başlayana kadar ben çoğunlukla birkaç yıl için bir usul programcı ve OOP programlama karşı mücadele değil, ama gerçekten çok alaka görmedim ki ... olmasıdır.

Daha karmaşık uygulamalar için yalın, kolay bakımı kod yazmak gerektiğinde cepten gerçekten, benim görüşüme göre, parlar. Ve zihin, her durumda, ama usul sadece bu işe olmaz yerlerde bazı vardır değil.

Büyük OOP uygulamaları benim örneklerin çoğu ben ilgili tüm ama tüm biraz farklı idi çeşitli şeyler vardı projeler içindir. Formları çok, çok sayıda kullanıcı, ürünleri vb bir sürü siteler

Hepsi vb baskı (), güncelleme (), gibi benzer davranış isimler var .. ama nesneler olarak onları kuşatmak ve sınıflarında yöntemlerinin değişik uygulamaları ile ben site genelinde çok basit ve temiz zamanında kodumu yapabilirsiniz. Ayrıca, ve bu farklı davranışları olmasına rağmen, anahtar oldu, ben farklı nesneler ile çalışmak olabilir using the same method calls throughout the entire application. Ben derin kodu çalışırken ikinci bir geliştirici fiili uygulama üzerinde çalışmaya olanak sağlar.

Herhangi ama çok uzun zaman önce sizin durumunuzda olan birisi olarak konuşuyorum, ben OOP seviyorum yardımcı olur bilmiyorum.

Procedural vs. OOP Explained: Ben farkı anlamada size yardımcı olabilecek bir süre önce bir blog yazısı yazdı

Lets say I have a big file with 50 functions, why will I want to call these in a class? and not by function_name(). Should I switch and create object which holds all of my functions?

OOP Hareketli yukarıda tarif şekilde basit bir 'anahtar' olarak görülmemelidir.

OOP Beynini rewiring içerir programlama hakkında düşünme tamamen farklı bir yol gerektirir. Bir beyin rewiring olmaz gibi bir gecede pek çok insan gerekli yeniden kablolama işlemi kendilerini göstermek istemezler. Araştırma, eğitim, deneme ve hata: Ne yazık yeniden kablolama zaman ve çaba bir yatırım almak için gidiyor.

Gerçekten geri adım atıyor ve OOP ardındaki kavramları öğrenmek, ancak geri ödeme bunun öncesi www günlerde bu süreçte gittim birisi olarak konuşuyorum iyi değer olacak içerir.

Eğer 'get it' ve size programlama yaşam daha iyi nasıl değiştiğini başkalarına söylüyorum olacak sizin günlük OOP iyi uygulamaları izledikten sonra.

Eğer gerçekten OOP anlamak kez kendi soru cevap olacaktır.

50 işlevlerini yerine Araçları sınıfa 50 statik yöntemler varsa, genel bir ad alanı "kirletmez".

50 statik yöntemlerle bir sınıf kullanma, yöntem adları sınıf için yerel.

OOP biri diğerinin ebeveyn / çocuk olabilir sınıfları denilen kod yapılandırılmış kaplar, oluşturmanıza olanak sağlar. Bu bakımı kolay olduğu gibi bir uygulama bina ile yardımcı olabilir ve, yapılırsa düzgün kod fazlalığını azaltabilir. OOP biraz havai eklese ama gerçekten fark edilmez ve prosedürel kod unmaintainablity ile galip olan. Senin büyük bir app yazıyorum varsa, def birçok kişi çalıştı olacak, özellikle eğer, Ö.Ö. gidin.

Örneğin, basit bir web sitesi tasarımı söylüyorlar. Bir Sayfa nesnesi oluşturabilirsiniz. Sayfa nesnesi veritabanına gidiyor ve bu meta verileri, başlık etiketleri, ya da böyle bir takvim denetimi gibi sayfa ve kendi türüne bazı "bileşenleri" hatta sayısının (bir widget olarak sayfa için çeşitli ayarları almak için sorumlu , vb.)

Sonra başka bir sınıf oluşturabiliriz, Page uzanır Endeksi, söylüyorlar. Dizin dizin veya ana sayfa olacaktır. Eğer bir ürün kataloğu olsaydı, Katalog sınıf sayfasını genişletmek olabilir. Katalog bölümü ve ana sayfası her ikisi de size yardımcı olur zaten öyle 1 nesneye sahip, sayfanın meta ve sayfanın temel inşaatı konusunda veritabanından veri almak gerekir çünkü. Bu durumların her ikisinde de, sayfa tüm iş yapar ve veritabanından sayfa veriyi alır, senin dizin sınıf ve katalog sınıfta hem de daha sonra erişilebilir değişkenleri, içine yükler. Sen veritabanına gidin ve yazdığınız her sayfada tekrar almak için kod yazmak zorunda değilsiniz.

Şimdi böyle bir içerir gibi usulen bu yapmak için başka yolları vardır. Ancak, kendinizi daha az hata ve hatalar yaparak bulabilirsiniz. Örneğin, sizin Page sınıfında soyut yöntemini tanımlayabilirsiniz. Bu nedenle bu yöntem genişleten herhangi bir nesne tanımlanmış olması ZORUNLU anlamına gelir. Yani sizin Page sınıfında soyut bir setPageAttributes () fonksiyonu yarattı söylüyorlar. Bunu yaparken boş bir işlev oluşturun. Eğer indeks sınıf oluşturduğunuzda, bu tür Page sınıfında tanımlanan değişkenleri erişim ve gerçek sayfadaki öğeleri, şablonu veya ayarlamak için kullanmadan olarak doldurarak üzerinde niyetiyle setPageAttributes () function (oluşturmak ZORUNDA Kullandığınız) ya da bir PHP hatası olsun bak.

Eğer proje yazılı almak için diğer insanlarla birlikte çalışıyorsanız, soyut yöntemleri "Hey, sen yazmak herhangi bir kod bu işlevleri tanımlamak gerekiyor", kişi anlatacağım. Bu tutarlı olması uygulamayı zorladı.

Eğer OOP yapmazsanız nihayet, bu MVC biçimleri gibi çerçeveler gidemez. Bu MVC gitmek için gerekli değildir ve bazı tartışmalar olsa da, bu uygulamanın tüm bileşenleri ayırmak yapar ve birçok kişi (tasarımcılar, kodlayıcılar, pazarlama çalışanları) aynı kod üzerinde çalışmak ortamlarda gereklidir.

Kabul cevabı böyle örnek herew gibi bir değişken adını dayalı işlevleri çağırmak mümkün olduğunu belirtmek için ihmal etmiş gibi görünüyor:

function drive($the_car){
    $the_car();
}

Kuşkusuz orada bu durumda, her araç için bir işlevi olması gerekir ama çok daha verimli önerilen switch deyimi daha var olacaktır.


Diğer değişkenler gibi kolayca temin edilebilir:

function operate($the_car,$action){
    $the_car($action);
}

function ferrari($action){
    switch($action){
        case 'drive':
            echo 'Driving';
            break;

        case 'stop':
            echo 'Stopped';
            break;

        default: return;
    }
}


operate('ferrari','drive');

Orada burada bir switch deyimi ama bu yüzden hiçbir şekilde bir çelişki öyle özgün örnek değildi, ek işlevsellik sağlamak için bulunuyor.