Türkiye Online Medya Araştırması
Profili Göster

PHP ile OOP Giriş

Hakan DAMAR Tarih: 23/09/2009 Yorum: 0 adet

Okunma : 1219 Tutanlar: Bu yazıyı 4 kişi tuttu.

Etiketler :

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.
?>

mmistanbul.com 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

aç-kapa İçeriğin rss beslemesi kullanımda değil Yorumlar

İçeriğe kayıtlı yorum bulunmuyor. İlk yorumu siz buradan ekleyebilirsiniz.


aç-kapa Yazarın Diğer Yazıları

yeni üyelik | şifremi unuttum

aç-kapa Seminer Ankara Adobe CS4 Semineri

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

aç-kapa Yarışma Global Game Jam (Yenilikci Oyun Gelistirme Dunya Maratonu)

Global Game Jam (Yenilikci Oyun Gelistirme Dunya Maratonu)

29-31 Ocak tarihleri arasindaki Global Game Jam (Yenilikci Oyun Gelistirme Dunya Maratonu) etkinligi su ana kadar basvuran farkli ulkelerden 112 merke...
Kategori: Yarışma

aç-kapa Konferans XII. Akademik Bilisim Konferansı

XII. Akademik Bilisim Konferansı

II. AB'10 XII. Akademik Bilisim Konferansı 10-12 Şubat Mugla Üniversitesi Üniversitelerde bilgi teknolojileri konusunda ilgili grupları biraraya ...
Kategori: Konferans

aç-kapa Yarışma 3. Uluslararası Ekslibris Yarışması: İstanbul 2010

3. Uluslararası Ekslibris Yarışması: İstanbul 2010

İstanbul Ekslibris Dernegi, Feyziye Mektepleri Vakfı ve Işık Üniversitesi, kitaplar için mülkiyet işareti olarak kabul edilen ve üzerinde estetik dege...
Kategori: Yarışma

aç-kapa Konferans Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Generally speaking, the term "New" brought about debates. We try to open up and elucidate the term "New" along with "Interact...
Kategori: Konferans

üyeler Son Kahramanlar...

stats Kimler Burada? web stats

Son 1 dakika içinde MMIstanbul' da 330 (1 kayıtlı, 329 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:

Wox ...

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)

coldfusion mysql ubuntu
 
sponsor adobe istanbul