RSS

PHP class (sınıf) yapısı

27 24 Aralık 2011 ~ Musa Avcı — Orta

Bundan sonraki yazılarımda ağırlıklı olarak PHP frameworkleri ve PHP sınıfları göreceksin, bu yazıda bunların bir habercisi diyebilirim. Aslında fonksiyonlara ihtiyaç duymadan istediğin bir çok projeyi gerçekleştirebilirsin, kopyala-yapıştır özelliği olmadan da bir çok yazıyı tekrar tekrar yazabileceğin gibi.

Fakat fonksiyonlar sayesinde sıkça tekrar edilen kod bloklarını bir kere yazıp, istediğin yerde istediğin kadar kullanarak büyük bir kolaylık sağlıyorsun. Bu düşünce ile sadece fonksiyonlar kullanarak sınıf yapısına hiç girmeden de bir çok projeni gerçekleştirebilirsin… Son cümlem ile yukarıda kullandığım cümleyi çağrıştıracak olursan sınıf yapısınında ne derece gerekli ve etkili olacağını hesaplayabilirsin.

Yani bir yazılımda fonksiyonlar ne kadar avantaj ve zaman kazandırıyorsa, sınıflarda bu kazancın bir sonraki leveli gibi. sınıflardan sonrada bir çok level mevcut ve bu neredeyse hiç kod yazmamaya kadar gidiyor.

PHP class nedir?

Sınıflara bir çok fonksiyonu bir düzene göre bir arada barındıran yapılardır. Belli bir konu ya da olayın fonksiyonlarını içerir ve belli bir amacı olduğu için sınıf kurulma ihtiyacı duyulur. Mesela bir toplama işlemi için sınıf tanımlamamıza gerek yok, ama bir üyelik ya da alışveriş sepeti için sınıf hazırlayabilirsin.

Üyelik örneğinden gidelim, üyelik sınıfında üye ekleme, silme, düzenleme ve listeleme fonksiyonları olur. Sadece bir üyelik sınıfı ile tüm bu üyelik fonksiyonlarına ulaşabilirsin. Sadece bir arada ulaşmanın da dışında aynı zamanda fonksiyonların arasında sınıf içinde veri transferi de sağlayabilirsin.

Verdiğim üyelik örneği üzerine bir üyelik sınıfı hazırlayayım.

class uyeler {
   public $veriler;
   function ekle($ad, $soyad) {
      $this->veriler[] = array('ad' => $ad, 'soyad' => $soyad);
   }

   function duzenle($no, $ad, $soyad) {
      if(!isset($this->veriler[$no])) return false; // eğer yoksa olumsuz
      $this->veriler[$no] = array('ad' => $ad, 'soyad' => $soyad);
      return true;
   }

   function sil($no) {
      unset($this->veriler[$no]);
   }

   function listele() {
      foreach($this->veriler as $no => $uye) {
         echo $no . ' - ' . $uye['ad'] . ' ' . $uye['soyad'] . '<br/>';
      }
   }
}

Eğer bu sınıf yapısını ilk görüşün ise öncelikle $this değişkenini tanıştırmakla başlayabilirim. Fonksiyonların içinde çağırdığımız $this, o sınıf içersinde tanımlanmış bir global değişken gibidir. Nasıl bir fonksiyonların içinde kullanılan değişkenler sadece kendi içlerinde varlarsa, tüm sınıfın içerisinde varolması istenen değişkenlerde bu $this değişkeni üzerinde barındırılır.

$liste = new uyeler();
$liste->ekle('Musa', 'Avcı'); // 0 nolu üye eklendi
$liste->ekle('Bill', 'Gates'); // 1 nolu üye eklendi
$liste->duzenle(0, 'Mehmet', 'Yılmaz'); // 0 nolu üye düzenlendi
$liste->sil(1);

Buradaki örnektede yukardaki “uyeler” sınıfını kullandım, tüm bir sınıfı $liste adında bir değişkene yükledim ve tüm bu içeriği sadece o değişken üzerinden kontrol edebilirim. Ayrıca bir diğer espiriside aynı sınıftan birden fazla oluşturabiliyor olmamız.

$ogrenci = new uyeler();
$sanatci = new uyeler();
// ...
$ogrenci->ekle('Musa', 'Avcı');
$sanatci->ekle('Barış', 'Manço');

Aynı sınıfı iki bağımsız değişken üzerinde tanımlayarak her birinde ayrı işlem yapabilir ve sonra istediğimizin verilerine ulaşabiliriz.

Sınıfların yapıcı ve yıkıcı metodları

Bir sınıf oluştururken eğer o sınıfın içine aynı isimde bir metod tanımlarsak bu aynı zamanda o sınıfın yapıcı metodu olur. Yapıcı metod sınıf ilk oluşturulmak istendiğinde otomatik çağrılır, yani “new class()” denildiğinde. Metodun aynı adını kullanmak yerine “__construct” şeklinde de yazabilirsiniz.

class deneme {
   function deneme() {
      echo 'Sınıf yapıcısı çalıştı!';
   }
}

$deneme = new deneme();

Ekranda “Sınıf yapıcısı çalıştı!” yazar. Ayrıca bu metoda ekleyeceğimiz parametreler sınıf ilk çağrıldığında kullanılabilir.

class kedi {
   function kedi($isim) {
      $this->isim = $isim;
   }

   function miyav() {
      echo $this->isim . ': Miyav!';
   }
}

$kedi = new kedi('Çomar');
$kedi->miyav();

Ekranda “Çomar: Miyav!” yazar.

Yıkıcı metodu “__destruct” sınıfın yok edileceği sıra çalışır, bu genellikle tüm ifadelerden sonra gerçekleşir. Kullanımına örnek vermek gerekirse bir veritabanı sınıfında yıkıcı metoda veritabanı ile bağlantısını kesme komutunu verebilirsiniz, fakat bu işlemi normal bağlantılarda PHP otomatik olarak yapmaktadır.

class deneme {
   function __destruct() {
      echo 'Sınıf yok ediliyor.';
   }

   function deneme() {
      echo 'Selam Dünya!';
   }
}

$deneme = new deneme();

Ekranda “Selam Dünya! Sınıf yok ediliyor.” yazar.

Sınıfların miras alınması

Bir çok dilde de extends ifadesiyle gerçekleşen miras olayı ise adı üzerinde bir sınıfa miras alınan sınıfın metodlarını ve değerlerini dahil eder.

Ben bunun rahat anlaşılması için yine bir üye sınıfı ve bu sınıfı miras alan öğrenci ve öğretmen sınıfları yapacağım.

class uye {
   public $ad;
   public $soyad;

   function isim($ad, $soyad) {
      $this->ad = $ad;
      $this->soyad = $soyad;
   }

   function isim_yaz() {
      echo $this->ad . ' ' . $this->soyad;
   }
}


class ogrenci extends uye { // uye sınıfını miras aldık
   public $sinif;

   function sinif($sinif) {
      $this->sinif = $sinif;
   }

   function sinif_yaz() {
      echo 'Sınıf: ' . $this->sinif;
   }
}

class ogretmen extends uye { // uye sınıfını miras aldık
   public $ders;

   function ders($ders) {
      $this->sinif = $ders;
   }

   function ders_yaz() {
      echo 'Ders: ' . $this->ders;
   }
}

$ogrenci = new ogrenci();
$ogrenci->isim('Ahmet', 'Yılmaz'); // bu metod uye sınıfından miras.
$ogrenci->sinif('12-A'); // bu ise ogrenci sınıfına ait metod.

$ogretmen = new ogretmen();
$ogretmen->isim('Mehmet', 'Çetin'); // bu metod uye sınıfından miras.
$ogretmen->ders('Türkçe'); // bu ise ogretmen sınıfına ait metod.

üye” sınıfında olan isim metodu, hem “öğrenci” hem de “öğretmen” sınıflarında kullanılacak bir metod olduğu için o sınıflarda da benzer metodlar tanımlamak yerine “üye” sınıfını miras alarak o sınıfın bünyesine dahil etmiş olduk.

Sınıf değerlerinin görünürlüğü

Sınıfları ifade ederken ilk satırlarına yazdığımız değerler yukarıda da bahsettiğim gibi tüm sınıf içerisinde $this değişkeni ile ulaşılabilen değerlerdir. Bu değerlere public, private ve protected adında 3 farklı görünürlük tanımlayabiliyoruz.

“public” dediğimizde o değişkene sınıf dışarısından da erişime izin vermiş oluyoruz.

class uye {
   public $isim; // herkese açık değer

   function uye($isim) {
      $this->isim = $isim;
   }
}

$uye = new uye('Musa');
echo $uye->isim; // sınıf içerisindeki değişkene ulaştık.

Bu kullanımda herhangi bir hatayla karşılaşmazken “private” ya da “protected” dediğimizde dışarıdan ulaşılmaya çalışıldığında hata verir. Bunların kullanımına örnek olarak eğer dışarıdan değiştirilmesini ya da okunmasını istemediğiniz ve sadece sınıf içerisinde işlemler yapmak için tutacağınız şifre gibi değerlerde tutabilirsiniz.

“private” ve “protected” farkı ise private dediğimizde bu sınıfı miras alan (extends eden) alt sınıflara bu değerin ulaşmaması sağlanıyor. “protected” de ise sadece dışarıdan ulaşılması engelleniyor, alt sınıflardan ulaşılabilir.

Metod zincirleme

Bu pratik yöntem sayesinde art arda metodlar çağırabilirsiniz. Tek yapmanız gereken zincirleme metod yapmak istediğiniz metodda sonuç olarak “return $this;” demek. Bu sayede metod çağırıldıktan sonra sonuç olarak kendisini yani sınıfı döndürecek ve biz tekrar metod çağırmaya devam edeceğiz.


class islem {
   public $sonuc = 0;

   function topla($sayi) {
      $this->sonuc = $this->sonuc + $sayi;
      return $this;
   }

   function carp($sayi) {
      $this->sonuc = $this->sonuc * $sayi;
      return $this;
   }

   function sonuc() {
      echo $this->sonuc;
   }
}

$x = new islem();
$x->topla(5)->carp(10)->sonuc();
// ekranda 50 yazar.

// normal yolla yapsaydık her seferinde $x tekrar ifade etmemiz gerekirdi
$x->topla(5);
$x->carp(10);
$x->sonuc();

Bir başka PHP serüveninde görüşmek üzere!

Etiketler:

Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.

"PHP class (sınıf) yapısı" yazısı için 27 yorum yapılmış.

  1. Elinize sağlık. Gördüğüm bir eksiklği belirtme ihtiyacı hissetim. Php’nin yeni versiyonlarında sınıf adı ile aynı olan fonskyionlar yapıcı(constructor) fonksiyon olarak değerlendirilmiyor. Bunu bir not olarak makaleye eklemeniz yeni başlayan arkadaşların php güncellemelerinde sıkıntı yaşamasını engelleyecektir.

    • Musa AVCI dedi ki:

      php.net‘de şöyle denmiş:

      Geriye dönük uyumluluk için, PHP 5 belirtilen sınıfa ait bir __construct() yöntemi bulamazsa, sınıfın ismine bakarak eski tarz bir kurucu arayacaktır. Dolayısıyla, uyumluluk sorunu yaşayacağınız tek durum sınıf dahilinde __construct() isimli bir yöntemin amacı dışında kullanılması olabilir.

      bana aksine “__construct” kullanmak yerine sınıf adından oluşan metod yazmak daha yeni ve pratik bir yöntem olarak geliyordu. Ama anladığım kadarıyla ikisi arasında bir fark yok, tek aklıma gelen extends edilerek çağrıldığında bir önceki sıfının yapıcısını tetikletmek için “parent::ust_sinif()” şeklinde ifade edilecek olması.

  2. Eren dedi ki:

    Emeğine sağlık

  3. Acemi dedi ki:

    Peki yukarıdaki örneği form olarak nasıl kullanabiliriz ?
    class dosyasını include ettik diyelim üye ekleme sayfamıza..
    Ekle sil güncelle tek sayfada yapılabilir mi?

  4. ozan dedi ki:

    kardes c++ dakinin aynısı yani bbunu a-okurken sanki c++’ın blli bir bolumunu tekrar etmıs gibi oldum harıka….

  5. Adem uslum dedi ki:

    ellerine kolllarına beynine sağlık çok güzel anlatmışsın, başarılarının devamını dilerim

  6. erdal dedi ki:

    Heryerde php oop programlama ile ilgili hemen hemen aynı şeyler anlatılmakta, class yapıları extends vb…
    yalnız bunu nasıl kullanabileceğini kimse anlatmıyor,
    bir class ı oluşturduktan sonra bir kullanıcı kayıt formundaki submit butonuna basılınca veri nereye nasıl yollanır ortalıkta bilgi yok, class çağırılıyor ve manuel olarak veri içeri aktarılıyor..
    Klasik php yazan biri olarak ortalıkta bukadar çok biliyorum diyen, sayfalarca yazan fakat işe yaramaz 1000 satırlık php kod yazan bir çok insan mevcut.. Ve korkarımki şu yukarıdaki kodlarda kendini o diğer gereksizlerin içersinden sıyıramıyor,
    Keşke class ların standart bir formdan veriyi nasıl alacağını anlatmış olsaydın…

    • Taner dedi ki:

      Sevgili Erdal,
      yanliş yere bakiyorsun gibi geliyor bana… Form oluşturma, $_GET, $_POST sonra da mysql işlemlerine bakarsan iyi olur.

      Admine bu sunduğu bilgiler için teşekkür ederim. Ancak kodların yanına tam olarak ne yaptığını yazar ise yeni kullanıcılar için yararlı olur…

  7. webbaharatı dedi ki:

    Bilgiler için teşekkürler.
    sizden bir konuda yardımınızı bekliyorum, yardımcı olabilirseniz çok memnun olurum.
    Farzedelim şöyle bir classımız olsun:

    Örneğin parametrelerini dizi şeklinde alan bir classımız olsun:
    $form = new createformelements(type, array(‘w’=>’200’, ‘h’=>’30’));
    böyle bir parametreyi karşılayacak bir class yazmak istiyorum. Ancak array ile gönderdiğim parametreler çok daha fazla fakat değerini göndermediğim parametreler için class içindeki default değerleri kullansın istiyorum. Yani array içinde h parametresini göndermezsem kendi içinde default ne ise onu kullansın. Aslında çok karışık birşey değil. Class yapısına yeni alışıyorum bu yüzden takıldım. Verileri de illa array olarak göndermek istiyorum 🙂 Yardımcı olabilirseniz çok memnun olurum. Teşekkürler.

  8. emre dedi ki:

    merhabalar. method zincirleme olayını hep merak ediyordum. adını bilmediğim içinde google da arayamıyordum. burda öğrenmiş oldum. ayrıca bloğunuz çok kaliteli. tebrik eder, böyle kaliteli yazılarınızın devamını dilerim 😉

  9. visso dedi ki:

    Heryerde php oop programlama ile ilgili hemen hemen aynı şeyler anlatılmakta, class yapıları extends vb…
    yalnız bunu nasıl kullanabileceğini kimse anlatmıyor,
    bir class ı oluşturduktan sonra bir kullanıcı kayıt formundaki submit butonuna basılınca veri nereye nasıl yollanır ortalıkta bilgi yok, class çağırılıyor ve manuel olarak veri içeri aktarılıyor..
    Klasik php yazan biri olarak ortalıkta bukadar çok biliyorum diyen, sayfalarca yazan fakat işe yaramaz 1000 satırlık php kod yazan bir çok insan mevcut.. Ve korkarımki şu yukarıdaki kodlarda kendini o diğer gereksizlerin içersinden sıyıramıyor,
    Keşke class ların standart bir formdan veriyi nasıl alacağını anlatmış olsaydın…

    • Murat Ödünç dedi ki:

      Bu sana bir fikir verebilir eğer php biliyorsan


      veriler[] = array('ad' => $ad, 'soyad' => $soyad);

      }

      function duzenle($no, $ad, $soyad) {
      if (isset($this -> veriler[$no])) return false;
      $this -> veriler[$no] = array('ad' => $ad, 'soyad' => $soyad);
      return true;

      }

      function sil($no) {
      unset($this -> veriler[$no]);

      }

      function listele() {
      foreach($this -> veriler as $no => $uye) {
      echo $no . ' - ' . $uye['ad'] . ' ' . $uye['soyad'] . '';

      }
      }
      }

      $sis = new uyeler;
      $sis -> ekle("Nucky", "Thompson");
      $sis -> ekle("Sarı Çizmeli", "Mehmet Ağa");
      var_dump($sis);
      $isim = $sis -> veriler;
      foreach ($isim as $dizi ) {
      foreach($dizi as $anahtar => $deger){
      echo $anahtar . " " . $deger . "";
      }
      }

      ?>

  10. Murat Ödünç dedi ki:

    Teşekkürler güzel bir yazı olmuş. Zevkle okudum.

  11. Emre dedi ki:

    Güzel yazın için teşekkür ederim dostum. Kafama takılan birkaç yer var ezber yapmak istemiyorum dolayısıyla birkaç sorum olacak:)

    function listele() derken fonksiyonun içerisinde neden değişken tanıtmadık fonksiyon içerisinde değişkenler vardı?

    foreach($this->veriler as $no => $uye) bu kodda da as $no şeklinde bağlanamaz mıydık? Oradaki => $uye tam olarak neden öyle dendi.

    Cevabın ve ilgin için şimdiden teşekkür ederim.

  12. Erdi Kibar dedi ki:

    Sınıflara Metod Ekleme İşlemini Anlatırmısınız ?

  13. Emre Uyguç dedi ki:

    gerçekten sağlam site hacı eyw yalnız sınıfın içinden değişken almada anahtar degerleri biraz daha acsan iyi olurmuş public private pek anlamadım birde sınıfın icinde baska sınıftan veya baska bir dosyadaki değişkene ulaşmayı yapamadım

  14. Berkhan dedi ki:

    Hocam, anlatım müthiş. Çok sağolun..
    Bu arada;
    1-) bu uye,ogretmen,ogrenci ornegini çalıtıramadım. en altta ogretmen-> kısımlarında da var_dump yaptıgım zaman null gözüküyor.

    2-) Laravel için makaleler yazmaya başlayacakmısınız ? Düşünürmüsünüz ? (:

  15. Oğuzhan TAŞ dedi ki:

    Tebrikler, açıklayıcı bir makale olmuş

  16. ali kamil dedi ki:

    merhaba, çok güzel bir şekilde anlatmışsınız, malumunuz türkçe kaynaklardan öğrenmek daha bir zevkli,iliklerinize kadar öğreniyorsunuz resmen. benim size bir sorum olacak eğer vakit bulupta cevaplayabilirseniz çok memnun kalaccağım.
    bir class oluşturdum, içinde simplexml_load_string ile xml çekiyorum buraya kadar hiç bir sorun yok, ekrana istediğimi bastırıyorum fakat ioncube ile şifreleme yaptığımda bana, Fatal error: Call to undefined method ::[obfuscated]() in… diye bir uyarı veriyor, bana yardımcı olabillirmisiniz?

  17. Fatih dedi ki:

    Çok net bir anlatım. Teşekkürler.
    Açık kaynak kodlu scripting dili kullanıyoruz. Sunucularınımızın işletim sistemi açık kaynak kodlu. Bilgiye stackoverflow’da karşılıksız paylaşım yapan üyeler ve bu arkadaş gibi paylaşımcılar sayesinde ulaşıyoruz. Seviyemiz ne olursa olsun, biz tüm yazılımcıların çok borcu var. Bu borcu, onlar gibi biz de öğrendiklerimizi paylaşarak ödeyebiliriz.

  18. nakliyeci dedi ki:

    Musa emegine saglik, ancak bu kadar açıklayıcı olabilirdi.

  19. Emre dedi ki:

    sonunda adam akıllı açıklamalar yapan bir içerik bulabildim. her yerde saçma sapan örnekler var. ordan alıyo oraya yazıyo. ordan yazıyo ordan çıkıyo. lan kullanım amacı üzerinde bir örnek yok.
    ilk defa anlayabildiğim bir ifade gördüm bu sayfada. teşekkürler

  20. vahdettin dedi ki:

    $this->veriler[] = array(‘ad’ => $ad, ‘soyad’ => $soyad);
    // bu satırı anlamadım , dizi tanımlarken içi boş köşeli parantez dha once gormedim nasıl oluyor bu

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir