PHP ile OOP Giriş
Hakan DAMAR Tarih: 23/09/2009 Yorum: 0 adet
Okunma : 1219 Tutanlar: Bu yazıyı 4 kişi tuttu.
Merhaba,
Bu makalede PHP ile Object-oriented Programming(Nesne Yönelimli Programlama) giriş yapacağız. Makale giriş seviyesi fakat NYP(Nesne Yönelimli Programlama) ileri seviye bir konu olduğundan, PHP ile yeni web uygulamaları geliştirmeye başlayan kişilere tavsiye etmiyorum. Öncelikle PHP'de bir seviye uzmanlaşmakta fayda var. Yoksa bu makaleler zor ve öğrenmesi güç gelecektir. Bilindiği üzere Class(Sınıf)'lar metodların birleşmesinden oluşur. PHP ile hazır gelen ve kendi oluşturabileceğimiz metodlar vardır. Bunlardan ilk iki tanesi _construct ve _destruct metodlarıdır. _Construct Metodu; Object(Nesne) ilk yüklediği anda çalıştırılacak kodların bulunduğu bölümdür. Daha önce ASP.NET ile web programlama yapmış arkadaşlar bunu PageLoad() methoduna benzetebilirler. PHP 4'te bu Class'ın adı ile aynı bir method oluşturarak mümkündü fakat PHP 5 ve sonrasında bunun yerine __construct() methodu getirildi. void __construct ([ mixed $args [, $... ]] ) __Destruct Metodu; Bu metod ise nesne ile işimiz bittiğinde otomatik çağırılan metottur. İstersek manuel de çağırabiliriz. void __destruct ( void ) Şimdi bu metodları bir örnek üzerinde inceleyelim.
<?php
class testClass {
function __construct() {
print("Nesne çağırıldığında ilk ben gelirim. <br>");
}
function __destruct() {
print("Nesne ile işimiz bitti.");
}
}
$test = new testClass();
print("Diğer kodlar...<br>");
?>
Gördüğünüz gibi ilk önce _construct() metodu çalıştı ardından sayfa içerisindeki kodlar sonuna kadar çalıştırıldı ve en son olarak _destruct() metodu çağırıldı. Construction'da class içerisinde bolca kullanacağımız parametreler verilebilir. Destruction'da ise açık veri tabanı bağlantıları, session yok etme, hafızayı temizleme, arabelleği boşaltma v.b. gibi işlemler yapılabilir. Bunları ilerleyen makalelerde bolca kullanacağız. Bir class'ı new komutu ile oluşturacaksanız public olarak _construct metodunu kullanmalısınız. Fakat PHP'de _construct() ve __destruct() metodları olmadanda bir class oluşturmanız mümkündür.
_AutoLoad() metodu, daha önce projelerimizde kullandığımız requireonce() ve include_once() metodlarına benzemektedir. Fakat bunu class içerisinde otomatik yaparak bizi, acaba şu class'ı veya interface'i include(dahil etmek) ettim mi? Sorusundan kurtarır. Bu metodu daha verimli kullanmak için class'larımızı ve interface(Arayüz)'lerimizi hiyerarşik yapıdaki bir klasörde tutmamızda fayda var. Anlatmak istediğimi bir örnek üzerinde inceleyerek pekiştirelim.
Klasör yapımız aşağıdaki şekilde olsun;
+ Proje
++ library
+++ testClass.php
+++ denemeClass.php
index.php
Metodumuzu aşağıdaki şekilde yazarsak Class'larımızı otomatik yükletebiliriz.
<?php
class test{
function __construct(){
print("Class'larımızı otomatik yükletiyoruz.<br>");
}
function __autoload($className){
$includePath = "library/{$className}.php";
if(file_exists($includePath)){
require_once '$includePath';
}else{
throw new Exception("{$className}.php dosyası yüklenemedi!");
}
}
}
$test = new test();
$test->__autoload("test");
?>
Bu Class'ımız içerisinden çağırmak için kullanabileceğimiz bir yöntem. Fakat uygulamamız içerisinde, daha önceden hiç bir nesne oluşturmadan _autoload() adında bir fonksiyon yazarakta yapabiliriz. Gördüğünüz üzere yukarıdaki _autoload() metodunu çağırmak için new komutu ile önceden test() adında bir nesne oluşturuyoruz. Bunun yerine aşağıdaki şekilde bir fonksiyon ile de çözebiliriz.
<?php
function __autoload($className){
$includePath = "library/{$className}.php";
if(file_exists($includePath)){
require_once '$includePath';
}else{
throw new Exception("{$className}.php dosyası yüklenemedi!");
}
}
__autoload("test");
?>
Yukarıdaki fonksiyonu direkt olarak uygulamamızın içerisinde istediğimiz bir yerde, yeni bir nesne oluşturmadan __autoload(string <param>); şeklinde kullanabiliriz. Not: __autoload() bloğu içerisinde oluşan hatalar catch bloğu ile yakalanamaz! Erişim Hakları; Nesne içerisindeki bir değişkenin veya metodun nerelerden erişilebileceğini belirlememizde bize yardımcı olan komutlardır. Public, Private, Protected olarak 3 türü mevcuttur. Public; Bu şekilde tanımlarsak heryerden erişilebilir olduğunu bildiririz. Eğer bir metodun başına hiç bir şey belirtmeden direkt tanımlarsak PHP bunu varsayılan olarak public(paylaşılan) olarak kabul eder. PHP 4'te public yerine kullandığımız var anahtar'ı geriye uyumluluk adına desteklenmektedir fakat PHP'nin 5.1.3 sürümünden önceki bir sürüm üzerinde uygulama geliştiriyorsanız bu E_STRICT uyarısına sebeb olur. Private; Sadece tanımlanan Class(Sınıf) içerisinden erişilebilir. Protected; Bu tür tanımlanan metod veya değişkenler sadece ilgili Class içerisinden veya türetilen Class içerisinden erişilebilir. Public gibi dışarıdan erişimi mümkün değildir. Zend Studio gibi gelişmiş bir PHP IDE'si kullanıyorsanız zaten yeni bir nesne oluşturduğunuzda size Private ve Protected olarak tanımlanmış metod ve değişkenleri göstermeyecektir. Şimdi bunları bir örnek ile inceleyelim.
<?php
/* Ana Class Tanımlası */
class parentClass{
public $degisken1 = "Ben her yerden erişilebilirim.";
private $degisken2 = "Ben sadece class içerisinden erişilebilirim.";
protected $degisken3 = "Ben hem class içerisinden hemde türetilen class'lardan erişilebilirim.";
/**
* Bilgi veren metod.
* @return string
*/
public function _getInfo(){
print $this->degisken1."<br>";
print $this->degisken2."<br>";
print $this->degisken3."<br>";
}
}
$foo = new parentClass();
print $foo->degisken1; // Çalışacak.
print $foo->degisken2; // Hata verecek.
print $foo->degisken3; // Hata verecek.
$foo->_getInfo(); // Çalışarak, 3 değişkenin içeriğinide yazacak.
?>
Gördüğünüz gibi Zend Sutdio'da nesnemizi oluşturduğumuzda bize sadece public metod ve değişkenleri göstermektedir. Aksi taktirde uygulamamız Fatal Error(Ölümcül Hata) ile sonlanır. Burada _getInfo() ismi ile tanımladığımız bilgi veren metodumuz biraz kafanızı karıştırabilir. Hani private ve protected metodlara dışarıdan erişilemezdi? gibi bir soru ortaya çıkabilir. Biz nesnemizdeki _getInfo() metodunu public olarak oluşturduk ve çağırdık. _getInfo() metoduda class içerisinde olduğundan yine class içerisindeki private,protected ve public değişkenlere erişme hakkı var. Yani biz metodu call(çağırmak) ediyoruz. O metod kendisi erişebildiği değişkenlerin değerlerini bize gösteriyor.
Protected erişim türünü daha iyi inceleyebilmek için, şimdi childClass() isminde yeni bir class oluturarak bunu parentClass()'mızdan türetelim.
<?php
/* Ana Class Tanımlası */
class parentClass{
public $degisken1 = "Ben her yerden erişilebilirim.";
private $degisken2 = "Ben sadece class içerisinden erişilebilirim.";
protected $degisken3 = "Ben hem class içerisinden hemde türetilen class'lardan erişilebilirim.";
/**
* Bilgi veren metod.
* @return string
*/
public function _getInfo(){
print $this->degisken1."<br>";
print $this->degisken2."<br>";
print $this->degisken3."<br>";
}
}
/* Çocuk Class tanımlaması ve parentClass'ından türetme */
class childClass extends parentClass{
protected $degisken3 = "<br> Değerini değiştirdik.";
/**
* Bilgi veren metod.
* @return string
*/
public function _getInfo(){
print $this->degisken1;
//print $this->degisken2; // Erişim Hatası. (Private)
print $this->degisken3;
}
}
$foo2 = new childClass();
$foo2->_getInfo();
?>
$degisken3 isimli değişkenin değerini burada override(ezmek) ederek değiştiriyoruz. Böylece artık $değişken3 türeyen class'ımızda atadığımız değere göre işlenecektir. Bu nedenle $foo2 nesnemizin _getInfo() metodunu çağırdığımızda "Ben hem class içerisinden hemde türetilen class'lardan erişilebilirim." değeri yerine "Değerini değiştirdik." yazısını göreceğiz. Hepimizin bildiği gibi başındaki <br> tag(etiket)'ı HTML'e özel bir tag olduğundan tarayıcımız bunu yorumlayarak göstermemektedir. Bu nedenle çıktıda gözükmemektedir.
Saygılarımla,
- Hakan DAMAR
İçeriğe kayıtlı yorum bulunmuyor. İlk yorumu siz buradan ekleyebilirsiniz.
Haber
İlişkili haber bulunamadı.
Ders
İlişkili ders bulunamadı.
Etkinlikler
Seminer
Ankara Adobe CS4 Semineri
9 Ocak'ta Ankara
Başkent Üniversitesi'ndeyiz...
Ankara'da 5 seminer dizisinden oluşacak maratonumuz başlıyor!
Ocak, Şubat, Mart aylarında Ankara'nı...
Kategori:
Seminer
Kimler Burada? 
Son 1 dakika içinde MMIstanbul' da 330 (1 kayıtlı, 329 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:
MMIstanbul Blog'undan
Blog Bölümü Blogevi.com'a Taşınıyor
Selam arkadaşlar MMIstanbul'da , tasarımcı ve programcıların blog yazılarını "feedleyerek" MMIstanbul okurlarını MMIstanbul dışın ...
7.500'üncü üyemiz Cem Koç!
Neler Yapılabilir?
500 Hatası Hakkında!
Reklam, MMIstanbul ve Yeni Projeler (Durumumuz Bu Tarzında)










