PHP Class (Sınıf) Yapısı
Sınıflar 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.
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ıflar 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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.
1
2
3
4
5
|
$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.
1
2
3
4
5
|
$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.
1
2
3
4
5
6
7
|
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.
1
2
3
4
5
6
7
8
9
10
11
12
|
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.
1
2
3
4
5
6
7
8
9
10
11
|
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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.
1
2
3
4
5
6
7
8
9
10
|
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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(); |
Kaynak