Sınıf(class) elemanlarının kullanıldıkları yere göre 3 tipi vardır. Bunlar public, protected ve private’tir.
public – sınıf elemanının her şekilde kullanılabileceği anlamına gelir.
protected – sınıf elemanının sadece aynı sınıf içinden veya eklenmiş sınıflar içinden kullanılabileceği anlamındadır.
private – sınıf elemanının sadece aynı sınıf içinden kullanılabileceği anlamındadır.
örnek vermek gerekirse;
<?php
#Okul isimli bir sınıfımız olsun
class Okul{ public $siniflar;
private $okulAdi;
protected $ogrenciSayisi;
public function __construct(){
$this->siniflar = array('1-A','1-B','1-C');
$this->okulAdi = 'Benim Okulum';
$this->ogrenciSayisi = 75;
}
}
Öncelikle henüz değeri olmayan sınıf özelliklerini tanımladık.
Bunlar siniflar, okulAdi ve ogrenciSayisi. Dikkat ederseniz siniflar public yani her yerden erişilebilir, okulAdi sadece Okul sınıfının ve ona bağlı diğer sınıfların içinden erişilebilir, ogrenciSayisi ise sadece ve sadece Okul sınıfı içinden erişilebilir. Bu bir tür kısıtlama. Standartlara uygun kod yazmakta epey faydası var.
__construct fonksiyonu ise nesne oluşturulduğu anda kendiliğinden çalışır. Yani nesne oluşturulduğu gibi önceden hiçbir değer taşımayan bu üç elemana __construct fonksiyonu içine belirtilen değerler eklenecektir. buradaki $this içinde bulunulan nesneyi belirtir ve içinde bulunulan ya da o nesneye bağlı her türlü eleman genellikle $this ile kullanılabilir. Genellikle yazıyorum çünkü onun da bir istisnası var. Şimdilik $this’in nesne içindeki elemanlara erişmek için kullanıldığını bilmek yeterli.
Kullanıma gelince;
<?php
#öncelikle Okul nesnemizi oluşturuyoruz.
$okul = new Okul();
#dışarıdan erişebildiğimiz public olan tek eleman siniflar olduğundan bunu direk kullanabiliriz.
print_r($okul->siniflar);
çıktısı
array(0 => 1-A,
1 => 1-B,
2 => 1-C)
gibi olacaktır. public olan “siniflar” haricinde hiçbir elemana $okul nesnesi ile direk erişemeyiz.
Şimdi diğerlerine bakalım.
<?php
#Okul isimli bir sınıfımız olsun
class Okul{
public $siniflar;
private $okulAdi;
protected $ogrenciSayisi;
public function __construct(){
$this->siniflar = array('1-A','1-B','1-C');
$this->okulAdi = 'Benim Okulum';
$this->ogrenciSayisi = 75;
}
#ogrenciSayisi değişkenine dışarıdan erişebilecek public foksiyonu oluşturalım
public function getOgrenciSayisi(){
return $this->ogrenciSayisi;
}
#ogrenci sayısını dışarıdan müdahale ile değiştirmemize yarayacak fonksiyonu yazalım.
public function ogrenciEkle($sayi){
$this->ogrenciSayisi = $this->ogrenciSayisi + $sayi;
}
}
şimdi kullanııma tekrar bakalım.
$okul değişkenimize Okul nesnesini oluşturmuştuk.
<?php
echo $okul->getOgrenciSayisi();//ekrana 75 yazar.
$okul->ogrenciEkle(10);//eskiden 75 olan öğrenci sayısına 10 daha ekledik.
echo $okul->getOgrenciSayisi();//ekrana 85 yazar.
Neden öğrenci sayısını protected yapıp dışarıdan erişimini engellediğimize gelirsek.
öğrenci sayısını kontrol ederek değiştirmek istiyor olabiliriz. Ya da belirli işlemlerden geçirilerek kullanılması gerekiyor olabilir. Ayrıca direk değişkenlere erişim bir süre sonra bazı durumlarda karışıklığa neden olabiliyor bunun için sistemli bir şekilde fonksiyonlar yazıp sınıf değişkenlerinin değerlerine bu şekilde müdahale etmek isteyebilirsiniz hem bu şekilde farklı yerlerde aynı kontrolü yapmak yerine bu değişkeni kullanmanız gereken her yerde istediğiniz kontrol kendiliğinden yapılacaktır.
Örnek vermek gerekirse okulunuzun kapasitesi 100 olsun. Eğer eklenmek istenen sayı 100′ü geçerse öğrencileri ekleyemezsiniz. Bunun için kontrol yapmanız gerek.
<?php
#öğrenci kapasitesini belirten bir değişken hazırlayalım
protected $ogrenciKapasitesi = 100;
#şimdi de ogrenciEkle fonksiyonunda kapasite kontrolü yapalım
public function ogrenciEkle($sayi){
if(($this->ogrenciSayisi+$sayi) <= $this->ogrenciKapasitesi){
$this->ogrenciSayisi = $this->ogrenciSayisi + $sayi;
return true;
}
return false;
}
okul kapasitesini (okulKapasitesi) 100 olarak belirttik ve her öğrenci eklenmeye çalıştığında mevcut öğrenci sayısı (ogrenciSayisi) ile eklenmek istenen öğrenci sayısı ($sayi) toplamının okulKapasitesi değişkenini aşıp aşmayacağı kontolünü yapıyoruz. Eğer okul kapasitesini aşacaksa eklemiyor ve bir problem olduğunu belli eden false dönüyor aksi halde true dönüyor ki bu da öğrencinin eklendiğini belirtiyor.
Kullanım şekline gelirsek;
en son 85 öğrencimiz vardı
<?php
echo $okul->getOgrenciSayisi();//ekrana 85 yazar.
#öğrenci eklemeye çalışalım. bu sefer fonksiyonun değer döndürmesini sağladık. o yüzden olumlu mu yoksa olumsuz mu olduğunu da kontrol edeceğiz.
if($okul->ogrenciEkle(20)){ // true ya da false dönecek
echo 'Öğrenciler başarıyla eklendi.
}else{
echo 'Öğrenciler eklenemedi. Okul kapasitemizi aştınız.';
}
bir de sınıflar için nesne ekleyelim.
<?php
class Siniflar extends Okul{
private sinifAdi = '1-A';
}
Burada kullandığımız “extends” sınıfı genişletmeye yarıyor. Bu şekilde Siniflar sınıfı hem Siniflar sınıfının kendisindeki hem de Okul sınıfındaki elemanlara erişebilir. Buradaki tek istisna Okul sınıfındaki private değişken olan okulAdi. Önceden de söylediğim gibi private değişkenler sadece aynı sınıf içinde kullanılabilir. Burada Siniflar sınıfı ile okuldaki sınıfların bilgilerini tutacağız ve okul ismine direk bir müdahalede bulunmamız sakıncalı diye düşünüp sadece Okul sınıfı içinden değişiklik yapmaya izin verdik.
Şimdi Siniflar sınıfından bir nesne oluşturalım;
<?php $siniflar = new Siniflar();
$siniflar kullanarak az önce $okul değişkeninde yaptığımız herşeyi yapabiliriz çünkü Okul, extends kullanılarak Siniflar nesnesine bağlı.
Umarım örneğim fazla kafa karıştırıcı olmamıştır.
Ayrıca protected, private ve public tipleri haricinde kullanım şekline göre “static” eklentisi var.
static’teki olay nesne oluşturmaya ihtiyaç kalmamasıdır.
<?php
class Oda{
protected static $masaSayisi = 10;
public static function getMasaSayisi(){
return self::$masaSatisi;
}
}
bu şekilde bir Oda sınıfı olduğunu düşünürsek masa sayısını ekrana yazdırmak için aşağıdaki kodu kullanırız.
echo Oda::getMasaSayisi(); // ekrana 10 yazdırır.
Buradaki en büyük fark Oda sınıfından bir nesne oluşturabiliriz fakat -> kullanarak yukarıda tanımladığımız elemanlara erişemeyiz. Erişememizin nedeni static olarak tanımlanmaları. Fonksiyonu herhangi bir nesne oluşturmadan çağırdığıma ve sınıf isminden sonra kullanılan :: işaretine dikkatinizi çekmek isterim. static elemanlar bu şekilde direk kullanılabilir. Aynı zamanda postun en başında sınıf içi elemanlara erişimde genellikle $this kullanılır demiştim. Bunun istisnası da yine static elemanlar. Fonksiyonun içine dikkat ederseniz masaSayisi değişkenine erişmek için önce “self” ardından yine :: kullandım. Static elemanlarda $this kullanamazsınız. Bu şekilde çağırmanız gerekir. Aslında daha anlatılabilecek çok şey var fakat saatin geç olduğunu farkederek bırakıyorum. Umarım açık bir şekilde anlatabilmişimdir.