18 Ocak 2008 Cuma

Nesne Yönelimli Programlama ve Php-2

Bazı özel metotlar;
Sınıflarınız içersinde kullanabileceğiniz bazı özel metotları ve bunların özelliklerini burada göstereceğiz.
Sınıflar içinde kullanılan bu özel metotlar “__” işareti ile başladığından, sizin oluşturduğunuz metotlarda “__” başlamanız önerilmez.

Yapılandırıcı( __destruct() ) ve Sonlandırıcı ( __destruct() )

__construct()

Bu metot sayesinde sınıfınız çağırılır, çağırılmaz otomatik olarak bu metot çalıştırılır. Bu metot genellikle nesneler üretilirken, sahip oldukları değişkenlerin değişik değerlerde olmasını sağlar. Fabrika örneğimize dönersek ürettiğimiz aynı çeşit iki arabanın bütün özellikleri aynıdır, yani aynı sınıfın metot ve niteliklerini kullanırlar, örneğin “araba_boya” diye bir metodumuz var, iki araba, iki ayrı nesnedir aynı metodu kullanır fakat biri siyah, biri kırmızı olabilir.Yani bunların kullandıkları nitelikleri birbirinden ayırmaya gereksinim vardır. Bu demek oluyor ki, nesneler üretilirken, onlara değişik kimlikler verecek bir mekanizmaya ihtiyacımız vardır. Bu görevi sınıf içinde yapılandırıcılar üstlenir.
Şimdi daha iyi anlamanız için basit bir örnek yapalım;
//Sınıfımızı tanımlıyoruz


class classname
{
function __construct($ad)
{
echo "Bu yazı sınıfınız çağırılır, çağırılmaz ekrana $ad yazdırır.";
}
}
//Sınıfımızı çağırıyoruz
$a = new classname("Enes");
unset($a);
?>
Aldığımız çıktı;
Bu yazi sinifiniz çagirilir, çagirilmaz ekrana Enes yazdirir.

__destruct()
Bu metot da __construct() metodunun tersi gibi düşünülebilir, bir nesneyi sonlandırırken otomatik olarak bu metot devreye girer. Genellikle bu metotla sınıf içerisinde oluşturulan niteliklerin değerini boşaltmak ve hafızayı daha verimli kullanmak için kullanılır.


class classname
{
function
__destruct()
{
echo “Bu nesne sonlandırılmıştır.”;
}
}
?>
Kullanılışı;
$r= new classname();
unset($r);
?>
Çıktısı;
Bu nesne sonlandirilmistir.

Erişim fonksiyonları ( __get() ve __set() )
__get() ve __set() kullanarak sarmalama(encapsulation) yapılabilir. Bir sınıfın niteliklerine direkt olarak erişmek yerine erişim fonksiyonları yazarak tüm erişimlerinizi bir tek kod parçası üzerinden gerçekleştirebiliriz. Bu sayede metotlarımıza yapılan kontrolsüz ve gereksiz erişimleri engelleriz ve dış öğeleri, sınıfımızın içindeki içeriğe ulaşmasını önceden tanımlı standart arayüzler aracılığıyla ulaşmasını sağlarız. Sistemleri oluşturan modüllerin birbirine olan bağımlılığını azaltmak için kullanılan en önemli metottur.

class classname
{
var $attribute;
function __get($ad)
{
return $this->ad;
}
function __set($ad,$değer)
{
$this->$ad=$deger;
}
}
?>

__get() fonksiyonu bir parametre (bir niteliğin adı) alır ve bu niteliğin değerini döndürür.
__set() iki parametre alır, bir niteliğin adı ve bunu ayarlamak istediğiniz değer.

__get() ve __set() fonksiyonlarını kullanarak istediğiniz niteliğin değerini kontrol edebilir ve ayarlayabilirsiniz.
Aşağıdaki kodu yazarsak;
“$a = new classname();
$a -> $degisken = 5;”

bu ifade kapalı olarak __set() fonksiyonunu çağırır. “$a -> degisken” olarak yazarsak bu da __get() fonksiyonunu kapalı olarak çağırır.

__autoload()
Bu bir sınıf metodu değildir, ama sınıflar içinde çok faydalı bir biçimde kullanılır.Özellikle oluşturulan bir sınıf için gerekli olan dosyaların sayfaya dahil edilmesi için kullanılır genellikle.

function __autoload($ad)
{
include_once(“$ad.php”);
}


Bu kod sınıfla aynı adı taşıyan bir dosyayı dahil etmeye çalışır.

__clone

Mevcut bir nesneyi klonlamımızı sağlar.
$b = clone $a;
Kodu $a nesnesinin aynı sınıfta bulunan ve aynı nitelik değerlerine sahip olan bir kopyasını oluşturur. İsterseniz bu özelliğini değiştirip başka bir kopyalama özelliği sağlayabilirsiniz bunun için sınıfımızda __clone() adında bir metot tanımlamamız lazımdır.

Statik sınıf sabitleri;
Bu sabiti, ilgili sınıfın örneğini oluşturmak zorunda kalmadan kullanabiliriz.

class Math
{
const pi =3.14;
}
echo 'Math::pi='.Math::pi."\n";
?>
Bu örnekte de gördüğünüz gibi, sınıfa ait sabite, sabitin ait olduğu sınıfı belirtmek için :: operatörünü kullanarak erişebiliriz.

Statik Metotların uygulanması;

Bu anahtar sözcük (static) metotlara uygulandığında, bu metotların ilgili sınıfın örneğinin oluşturulması gerekmeden çağırılmalarına imkan sağlar.

class Math
{
static function squared($input)
{
return $input*$input;
}
}
echo Math:: squared(8);
?>
Statik bir metodun içinde this anahtar sözcüğünü kullanamazsınız, çünkü başvuruda bulunulacak bir nesne mevcut olmayabilir.

Not: Diğer yazıda görüşmek üzere.



2 yorum:

ömer ölmez dedi ki...

hala bu class yapısını anlamış değilim anlamamakta adeta diretiyorum sanki.

kazaan dedi ki...

Aslında çokta fazla kasmamak gerek, bol bol örnek kodları incele, emin ol çözersin işin asıl mantığı DRY(Don't repeat yourself). Kendini tekrar etmemek. Yazdıgın sınıfları genis anlamda düşün ve ilk olarak bence kendine bir sayfalama sınıfı yaz. Nette bir sürü örnekte bulabilirsin yardımcı olur. Takıldığın bir yer olursa yine buraya yazarsan yardımcı olmaya çalışırım. Kolay gelsin.