Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

php class yapısı

merhaba arkadaşlar,

ben sorgularımı bu zamana kadar hep function'lar içerisinde yapıyordum. şimdi class yapısını kullanmak istiyorum fakat ne gibi fark yaratacak anlamış değilim.

class yapısının farkı nedir? neden class lara ihtiyaç duyulur? faydası sadece fonksiyonları kümelemek değildir heralde diye düşünüyorum. yanlış mıyım? işin özü nedir?
  • olayı çok iyi özetlemiş bunun üzerine söz seylemeye gerek yok. Güzel soruları elbette güzel cevaplar verilir.
    Kesali 11 yıl önce yazdı
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Doğru Cevap

  • 5
    madpoet adlı üyenin fotoğrafı
    11 yıl önce yazılmış
    84 cevap - 1 soru
    Class içinde fonksiyon değil olay, Object Oriented Programming (OOP) olarak geçer. Bir yöntem, programlama felsefesidir yani fonksiyonları kümelemek değil kesinlikle... Ha OOP yazıyorum diyen PHP programcılarının büyük bir çoğunluğu fonksiyonları kümeler o ayrı :)

    Programlamadaki her "şey" gerçek hayattaki nesneler olarak düşünülebilir. Mesela otomobil diye bir nesne var bunun "işlevleri" ve "özellikleri" var. İşlevler:
    - Hızlanır
    - Yavaşlar
    - Park moduna geçer

    Özellikler:
    - Rengi
    - Bagaj hacmi
    - Tipi (Sport, sedan, kup)

    İşlevler "method", özellikler "property" olarak adlandırılır. Senin anlayacağın karşılıkları method = function, variable = property.

    Peki ne işe yarar dersen, birçok işi var aslında.

    Mesela otomobil örneğinde ben aslında sana bir tanım yapmış oldum, artık bu nesneyi kullanmak için senin otomobilin içerisinde neler olduğunda, motorun çalışma prensiplerinden, enjektörlerden, soğutma - yağlama sistemlerinin nasıl çalıştığından haberdar olman gerekmez. Bilirsin ki benim tanımladığım otomobille 3 iş yapabilirsin.


    class Otomobil {
        public $renk;
        public $bagajHacmi;
        public $tip;
    
        public function hizlan() {
            if(!$this->_motorCalisiyorMu()) {
                throw new Exception('Motoru çalıştırmadan nereye?');
            }
        }
    
        public function yavasla() {
            ...
        }
    
        public function parkEt() {
            ...
        }
    
        private function _motorCalisiyorMu() {
            ....
        }
    }
    


    Bu örneğe bakarsak içeride motor çalışıyor mu kontrol ediyorum, ama private olduğu için biliyorum ki bu sadece class'ın içerisinde kullanılır, böylece class'ı kullanırken kolaylık sağlar...

    Özellikle komplex işlerde işleyişin detaylarını dışarıdan saklamak programı anlamanı ve doğru kullanmanı kolaylaştırır. Ayrıca bunlara otomatik testler yazabilirsin, böylece class'ın doğru çalıştığından emin olursun, programı geliştirmeye devam ederken hatayla karşılaşırsan bilirsin ki %90 ihtimalle class'ta sorun yok, içine girip kurcalamazsın...

    Bu faydalarından biri. Onun dışında class'ları extend edebilirsin.


    class Otobus extends Otomobil {
        public function yolcuAl() {
            ...
        }
    }
    


    Otobüs Otomobil'i extend etti. Böylece otobüs hızlanır, yavaşlar, park eder ek olarak bir de yolcu alabilir.

    Nesneleri transfer etmek daha mantıklı ve kullanışlı oluyor:


    class Otobus extends Otomobil {
        public function yolcuAl($yolcu) {
            ...
        }
    }
    
    class Yolcu {
        ...
    }
    
    $yolcu = new Yolcu();
    $otobus = new Otobus();
    $otobus->yolcuAl($yolcu);
    


    Otobüse yolcu alıyorsun ama otobüsün taşıma kapasitesi var dolayısıyla yolcuların kilolarını toplayıp kontrol ediyorsun bir yerlerde. Bunu OOP olarak yapmasan direkt kiloları bindirirdin otobüse, çünkü amaç kilo hesaplamak.

    Peki sonradan bir talep geldi, dendi ki bayanlar ve yaşlılara öncelik ver (atıyorum). Otobüse yolcu bindirirken kilosuyla beraber cinsiyet ve yaş bilgisini de alman lazım. OOP düşünmezsen yolcuAl fonksiyonuna bu parametreleri tek tek eklemen lazım. Eh yolcuAl fonksiyonunu 50 yerde kullandıysan 50 yerde bu parametreleri ayarlaman gerek. OOP düşünürsen sadece Yolcu ve Otobus class'larını güncellemen yeterli.

    En basit iki faydası bu. Daha bir sürü var, + design pattern'ler var, yani nesneleri kullanma yöntemleri diyebilirsin buna.


    OOP'ye kendi utility function'larını katmaya kalkma ama, o zaman nasıl kullanacağını anlayamazsın. Mesela özel bir fonksiyonun var array'lerle işlem yapmanı kolaylaştırmak için diyelim, bunun OOP ile bir alakası yok tek fonksiyon olacağı aşikar çünkü. Ben onları bir class altında static olarak topluyorum. Örnek:


    class ArrayUtils
    {
        public static function taklaAttir($array) {
            return array_reverse($array);
        }
    }
    
    $array = array(1, 2, 3, 4);
    $taklaciGuvercin = ArrayUtils::taklaAttir($array);
    


    İşte bu tam olarak fonksiyonları kümelemek oluyor, yine class kullandım ama Object Oriented Programlama yapmış olmadım.

    Bu konu üzerine kolum bacağım kalınlığında kitaplar mevcut anlat anlat bitmez o yüzden daha fazla detaya girmeyeceğim, biraz kendin araştır, biraz open-source örneklere bak nasıl tasarlamışlar: Zend Framework, Symfony2 hatta tam OOP olan diğer programlama dillerine bakabilirsin Java, Ruby, Python gibi.

    Ha bir de, OOP her zaman daha çok kod yazmanı gerektirir, tek kişi çalıştığın ufak projeler için gerekliliğini hissetmeyebilirsin, ama orta-büyük projelerde kullanmazsan bir süre sonra içinden çıkamaz hale gelirsin.
    • xuma adlı üyenin fotoğrafı xuma
      @madpoet cevap olayını güzel bir makaleye dönüştürmüşsün.Güzel bir cevap bende teşekkür ederim.
      11 yıl önce yazılmış
    • bensedat18 adlı üyenin fotoğrafı bensedat18
      valla harikulade bir anlatım olmuş. gözümün önü ışıdı sanki :).

      o halde yapacağımız projede nesnelerin ve sınırlarının iyi belirlenmesi gerek. sonrasında mesela bir araba için düşünürsek, bu arabanın iskeletine, nesneler yardımıyla parçaları oluşturup monte etmek kalıyor.
      hatta böyle bir durumda mercedes için hazırladığımız bir parçayı ufak rütuşlarla bmw ye uygun halede getirmek bile mümkün olabilir gibi.

      bu biraz da standart üretim, seri üretim olayına mı benziyor ne ? :D

      teşekkür ederim hocam makale kıvamında yazınız için.
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Phpclasses sizin tabirinizle yedek parça deposu gibi zaten her işi yapan çok detaylı yazılmış classlar mevcut.
      11 yıl önce yazılmış
    • madpoet adlı üyenin fotoğrafı madpoet
      bensedat aynen öyle :) O yedek parça olayına da loose coupling diyoruz. Yani her class'ın birbirinden bağımsız çalışacak şekilde tasarlıyorsun. Ufak rotüş falan yok, düzgün tasarlanırsa hiç rotüşsüz kullanırsın. Tabii bunlara girdin mi artık yazılım mühendisliğine girmeye başlıyor çok kolay değil...
      11 yıl önce yazılmış
    • bensedat18 adlı üyenin fotoğrafı bensedat18
      anlıyorum hocam. valla bugünü bilgi açısından karlı bir gün sayarak bitiriyorum sayenizde :). teşekkür ederim..
      11 yıl önce yazılmış

Cevaplar

  • siyahbeyaz adlı üyenin fotoğrafı
    11 yıl önce yazılmış
    472 cevap - 20 soru
    hatırladıgım kadariyla bilge adam'dan bir hoca vardi. php class lar hakkında bir makallesi vardi..

    class lar ıcın sunu soyluordu. siz class dosyalarını include ettiginizde php bu classları gormezden gelir boş bir txt dosyasını include etmiş gibi olursunuz buda su anlama gelior hic include etmemis gibi oluor. ve performans elde etmis oluyorsunuz taki new object seklinde tetikleyene kadar bu boyle devam edermis. class icinde kullandıgın fonksiyonları hangısını belırlersen onu calıstırırı. isin performans kısmıda burda oluor.