Merhaba arkaşdaşlar php 5.4 sürümü OOP (Object Oriented Programing) nesneye dayalı programlama nedir nasıl kullanılır onun üzerinde duracağız. Bildiğiniz gibi bir çok yazılım dili OOP’yi desteklemekte. OOP peki sisteme ne getiriyor? yazılım konusunda oluşturmuş olduğunuz sınıfları başka projelerde de kullanabiliyorsunuz. Sonra daha profesyonel bir yazılıma geçerek sizin yazmış olduğunuz kodlara diğer yazılımcılarda müdahale edebiliyor. Bu sayede bir çok yazılımcı bir projeyi geliştirirken OOP mantığıyla geliştirecek ve obez bir yazılım ortaya çıkmamış olacak. PHP OOP’yi öğrendiğinizde php ile yazılmış frameworkleri kullanabilir hatta geliştirebilirsiniz. Bu sayede en kısa sürede projelerinizi hayata geçirirsiniz. Hatta sizlerin PHP Nesen Tabanlı Programlama ile yazdığınız uygulamaları bu gibi frameworklere paket olarak sunabilirsiniz. Nesene tabanlı programlamanın yapası, mantığı ve kullanımı C++,C#,Java,python vb. bir çok yazılım dilinde hemen hemen aynıdır. Bu sebepten bir dilde Nesne tabanlı programlamayı öğrendiğinizde diğer dilleride öğrenmiş oluyorsunuz. Gelin sizinle birlikte PHP Nesne tabanlı programlamaya bir giriş yapalım.
Bir sınıf oluşturalım:
1 2 3 4 | class ogrenci{ // değişken // fonksiyon } |
Öğrenci adında bir sınıf oluşturduk. Bütün metod ve değişkenler {} parantez blokları içine tanımlanır. Funksiyondan ayıran kısım parametre gönderim alanın olmamasıdır ogrenci(). Ayrı bir önemli nokta ise class isimler bakıldığınında ne için yazıldığı anlaşılacak bir isim vermeye gayret edin. Bana kalırsa her sınıfın ve fonksiyonun başınada sizi temsil eden ön tag_ yerleştirin.
1 2 3 | class tmbl_ogrenci{ // Tembel Öğrenci :) } |
Sınıfımıza bir değişken yazalım ve bir de fonksiyon oluşturalım
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class t1_ogrenci{ private $ogrIsim; //dışa kapalı bir değişken oluşturduk public function ogrIsimAl($isim){ // parametre gönderebileceğimiz bir function oluşturduk/ Dışa açık $this->ogrIsim=$isim; //gönderdiğmiz parametreyi sınıftaki değişkene atadık. } public function ogrIsimYaz(){ // ekrana değişkene almış olduğumuz öğrenciyi yazdıracak fonksiyon oluşturduk. echo $this->ogrIsim; } } $ogrenciSinif=new t1_ogrenci(); //sınıfı çağırdık $ogrenciSinif->ogrIsimAl("ÇAĞLAR");// öğrenciyi atadık $ogrenciSinif->ogrIsimYaz(); // öğrenciyi ekrana bastık :) |
PHP $this-> Metodu Kullanımı
This metodu sınıf içersinde tanımlanmış olan bir nesneye veya fonksiyona ulaşabilmek için kullanılır. Sayfada ilgili sınıfı oluşturuken new metodu ile new t1_ogrenci() şeklinde oluşturduk. Farklı değişkenlere new t1_ogrenci() şeklinde tanımlamanız yeni sınıfların oluşmasını sağlayacaktır ve bu sınıflar birbirinden bağımsızdır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class t2_ogrenci{ private $ogrIsim; //dışa kapalı bir değişken oluşturduk public function ogrIsimAl($isim){ // parametre gönderebileceğimiz bir function oluşturduk/ Dışa açık $this->ogrIsim=$isim; //gönderdiğmiz parametreyi sınıftaki değişkene atadık. } public function ogrIsimYaz(){ // ekrana değişkene almış olduğumuz öğrenciyi yazdıracak fonksiyon oluşturduk. echo $this->ogrIsim; } } $ogrenciSinif=new t2_ogrenci(); //sınıfı çağırdık $ogrenciSinif->ogrIsimAl("ÇAĞLAR");// öğrenciyi atadık $ogrenciSinif->ogrIsimYaz(); // öğrenciyi ekrana bastık :) $ogrenciSinif_1=new t2_ogrenci(); //Farklı bir değikene yeni sınıf tanımladık $ogrenciSinif_1->ogrIsimAl("GÜLCE");//Yeni bir öğrenciyi atadık $ogrenciSinif_1->ogrIsimYaz(); //Yeni sınıfın yeni öğrencisini ekrana bastık :) |
Yukarıda aynı sınıftan iki tane farklı öğrenci sınıfı oluşturduk. Yine sınfıtaki fonksiyonlarıda $this->ogrIsimYaz() metodu ile çalıştırırken sayfada ise atadığmız değiken $ogrenciSinif->ogrIsimYaz() şekilinde çalıştırıyoruz.
__construct ve __destruct Kullanımı (Kurucu ve Yıkıcı Metodlar)
Bir sınıf çağrılacağından çağrılma esansında, sınıf oluşturulurken yapılması gereken işler varsa ve o işler her sınıf çağırıldığında yapılıyorsa bu gibi işlemler __construct kısmıda yazıyoruz. Aynı zamamda sınıf oluşturulurken parametre (veri) göndermemizide sağlıyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class t2_ogrenci{ private $data; private $user; private $pass; function __construct($dbName,$userName,$userPass){ //Sınıf oluşturulurken parametre gönderilmesini istedik $this->data=$dbName; $this->user=$userName; $this->pass=$userPass; //sınıf çağırılırken sınıfı içerisindek değikenlere //göndermiş olduğumuz parametler eklenecek echo "Veri tabanı bilgileri girildi."; } } |
Veri tabanı bilgileri sınıf çağırlırken parametre olarak girildi ve sınıfın ön yükleyicisi __construct bunları sınıf içerisindeki değişkenlere atandı. __destrcut sihirli metodu ise sınıfın sonunuda yıkıcı, yok edici metod olarak çalıştırılır örneğin bir veri tabanı bağlantısı kuruldu sonra kapatma işini __destruct ile yapalı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 | class db{ private $data; private $user; private $pass; private $dbBag; function __construct($dbName,$userName,$userPass){ //Sınıf oluşturulurken parametre gönderilmesini istedik $this->data=$dbName; $this->user=$userName; $this->pass=$userPass; //sınıf çağırılırken sınıfı içerisindek değikenlere //göndermiş olduğumuz parametler eklenecek try{ $this->dbBag=new PDO("mysql:host=localhost;dbname=$this->data;charset=utf8",$this->user,$this->pass); $this->dbBag->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Veri tabanı bağlantısı kuruldu"; }catch(PDOException $x){ echo $x->getMessage(); } } function __destruct(){ $this->dbBag=null; echo "<br />Veri tabanı bağlantısı kapandı"; } } $ogrenciSinif=new db("testdata","root",""); //sınıfı çağırdık |
Public, Protected, Private Kullanımı
Public : Public tanımlanan nesnelere sınıf içersinden ve dışından erişim hakkı verilir. Protected : Protected olarak tanımlanan değişken ve metotlara, tanımlanan sınıfın mirasçıları tarafından erişim sağlanabilir. Dışarıdan erişim olmaz. Private : Private olarak tanımlanan metod ve değişkenlerde ise sadece tanımlanan sınıf içersinden erişi sağlanır. Public, Protected ve Private olarak bir tanımlama yapılmadıysa nesne varsayılan olarak public kabul edilecektir. Bu sebebten oluşturulan metoda nesne dışındanda erişim sağalanacak.
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 | class ogrenciler{ public $ogrenciAdiSoyadi;//Sınıf dışından erişim sağlanabilir. private $ogrenciTc;// Tc önemli olduğu için sadece sınıf içersinde kullanılıcak protected $ogrenciSinifi;// Sınıflar arası miras yolu ile kullanılacak function __construct($ogrTc,$ogrSinif){//dışardan erişimi olmayan verileri construct metodu ile giriyoruz. $this->ogrenciTc=$ogrTc; $this->ogrenciSinifi=$ogrSinif; } public function ogrenciBilgi(){//ogrenci bilgilerini yazdıran metod printf( " ADI : %s <br /> SOYADI: %s <br /> SINIFI: %s <br /> ", $this->ogrenciAdiSoyadi, $this->ogrenciTc, $this->ogrenciSinifi ); } } $talebe=new ogrenciler("11111111111","1-A"); //Sınıfı çağırdık ve özel bilgileri parametre olarak gönderdik $talebe->ogrenciAdiSoyadi="Çağlar Hoca"; //$ogr->ogrenciAdiSoyadi public olduğu için sınıf dışından erişerek direk değer atadık $talebe->ogrenciBilgi();//Bilgileri ekrana bastık |
Mirasçı bir nesne oluşturmak için extends parametresi kullanılır. Örneğin class b extends a{} burada mirasçı b asıl sınıfı ise a dır. Aynı zamanda bir üst sınıfıtan protected bir değişken veya fonksiyon parent ve $this-> parametreleri kullanılarak çağırılır. Örnek bir mirasçı ve protected kullanı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 47 48 49 50 | class ogrenciler{ public $ogrenciAdiSoyadi;//Sınıf dışından erişim sağlanabilir. private $ogrenciTc;// Tc önemli olduğu için sadece sınıf içersinde kullanılıcak protected $ogrenciSinifi;// Sınıflar arası miras yolu ile kullanılacak function __construct($ogrTc,$ogrSinif){//dışardan erişimi olmayan verileri construct metodu ile giriyoruz. $this->ogrenciTc=$ogrTc; $this->ogrenciSinifi=$ogrSinif; } protected function ogrenciBilgi(){//ogrenci bilgilerini yazdıran metod ve mirasçı kullanabilir. printf( " ADI : %s <br /> SOYADI: %s <br /> SINIFI: %s <br /> ", $this->ogrenciAdiSoyadi, $this->ogrenciTc, $this->ogrenciSinifi ); } } class sinifBilgi extends ogrenciler{ // sinifBilgi nesnesi ogrenciler sınıfının mirasçısı oldu function __construct(){ //Bu sınıfın ön yükleyicisi. parent::__construct("11111111111","1-A");//burada üst sınıfı ön yükleyicisi parent ile çağrıldı. } public function ogrTamSinifBilgi(){// öğrencinin sınıf öğretmeni bilgisini veren fonksiyon parent::ogrenciBilgi(); // üst sınıftan öğrencinin bilgisini veren fonksiyon çağrıldı switch($this->ogrenciSinifi){//sınıf numarasına göre hoca adı yazıldı. case "1-A": echo "SINIF ÖĞRETMENİ: ÇAĞLAR HOCA"; break; case "1-C": echo "SINIF ÖĞRETMENİ: ALİ HOCA"; break; case "1-C": echo "SINIF ÖĞRETMENİ: ÖZDEMİR HOCA"; break; } } } $ogr=new sinifBilgi("11111111111","1-A");//Mirasçı sınıf çağırıldı $ogr->ogrenciAdiSoyadi="Çağlar Bostancı";//public olan üst sınıfın değişkenine öğrenci adı soyadı girildi. $ogr->ogrTamSinifBilgi();//Mirasçı içersindeki public fonksiyon çağırıldı. |
PHP ArrayObject (Dizi Nesne) Kullanımı
Bir sınıftan binlerce kez oluşturmamız gerekebilir ve bu sınıfları tutacağımız
değişkenler oluşturmak yerini sınıfları dizi olarak kullanabileceğimiz ArrayObject
sınıfı bulunmaktadır.
Kullanımına örenk :
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | class ogrenciler{ private $ogrenciAdiSoyadi;//Özel değişken oluşturuldu private $ogrenciTc;//Özel değişken oluşturuldu private $ogrenciSinifi;//Özel değişken oluşturuldu function __construct($adSoyad,$ogrTc,$ogrSinif){ //Sınıf çağırıldığında ön yükleyiciden parametre gönderilerek //sınıfın içinde özel tanımlanan değişkenlere parametreler atandı $this->ogrenciAdiSoyadi=$adSoyad; $this->ogrenciTc=$ogrTc; $this->ogrenciSinifi=$ogrSinif; } public function get_ogrTcGetir(){ //öğrenci tcsini dönderen fonksiyon return $this->ogrenciTc; } public function get_ogrAdSoyadGetir(){ //öğrenci adını dönderen fonksiyon return $this->ogrenciAdiSoyadi; } public function get_ogrSinifGetir(){ //öğrenci sınıfını dönderen fonksiyon return $this->ogrenciAdiSoyadi; } } class sinifBilgi extends ArrayObject{ // sinifBilgi nesnesi ArrayObject sınıfının mirasçısı oldu //ArrayObject sınıfı dizi sınıf işlemleri yapmamamızı sağlamaktadır. public function sinifYazdir(){ //disi olarak oluşturulan sınıfı döngüye sokarak //sınıfın içerisindeki öğrenci sınıfı değerlerini //tablo haline getiren ve geriye dönderen //fonksiyon yazılı. :) $data="<table border='1'> <tr> <td>ADI</td> <td>TC</td> <td>SINIF</td> </tr> "; for($say=0; $say<count($this);$say++){ $data.="<tr> <td>".$this[$say]->get_ogrAdSoyadGetir()."</td> <td>".$this[$say]->get_ogrTcGetir()."</td> <td>".$this[$say]->get_ogrSinifGetir()."</td> </tr>"; } $data.="</table>"; return $data; } } $ogr=new sinifBilgi(); $ogr[]=new ogrenciler("Çağlar Hoca","12345678999","1-A"); $ogr[]=new ogrenciler("Php Uzmanı","12345678999","1-B"); $ogr[]=new ogrenciler("WebMaster","12345678999","1-C"); $ogr[]=new ogrenciler("PHP Developer","12345678999","1-D"); echo $ogr->sinifYazdir(); |
PHP SINIF SELF ve PARENT ERİŞİMİ
Self: Bir sınıfı içerisindeki metodlara yani fonksiyonlara erişebilmemizi sağlar. Parent: Miras olarak oluşturulan sınıfın içersinden ana sınıfın metoduna erişim sağlamamızı sağlar. Aşağıda her ikisinide kullandığımız bir sınıf mevcut.
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 | class necipFazil{ private $siir;//class'a özel değişken function __construct($veri){ //ön yükleyicide setBekelenen metodu çağırılıyor. self::setBeklenen($veri); } protected function setBeklenen($dortluk){ //Mirasçının ulaşbileceği metod //$siir değişkenine atanıyor. return $this->siir=$dortluk; } protected function getBeklenen(){ //Mirasçının ulaşbileceği metod //$şiir değişkenine atanan veri geri dönderiliyor. return $this->siir; } } class siirYaz extends necipFazil{ function __construct($metin){ //mirasçının ön yükleyicisinden //parent ile ana sınıfın ön yükleyici çağırılıyor //parametre gönderiliyor. parent::__construct($metin);//üst sınfın construct ını çağırıyor. } public function yazdir(){ //sınıf dışından erişilebilir fonksiyon //üst sınıftan getBekelenen metodu çağırılıyor. echo parent::getBeklenen(); } } $dortluk=' Ne hasta bekler sabahı, Ne taze ölüyü mezar. Ne de şeytan, bir günahı, Seni beklediğim kadar. '; $edebiyat=new siirYaz($dortluk); //nesne oluşturuldu ve şiir gönderildi. $edebiyat->yazdir(); //ekranan basıldı. |
PHP Static Kullanımı
Fonkiston ve değişkenlerde static tanımlaması değişkenin
ram’e alınarak sürekli olarak çağırılmasını, bir
sınıfın metodlarına dikerek ulaşılmasını, oluşturulan sınıfın
bir kere çağırılarak tekrar tekrar yüklenmesini engellemiş olursunuz.
Önemli:
- 1-Class içerisinde static olarak verilen değişkenler self::$degisken
- 2-Statik tanımlanan değişkenler miras olarak devredilemez.
- 3-Statik olarak tanımlanan fonksiyonlarda static tanımlanmayan metodları kullanamazsınız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class nazimHikmet{ public static $sayac=0; public static function artir(){ self::$sayac++; } public function yazdir(){ echo self::$sayac; } } nazimHikmet::$sayac=5; //class içerisinde sabit değişkene değer atadık. nazimHikmet::artir(); nazimHikmet::artir(); //Class içerisinde artir() metodunu çağıdık bir artırdık $class=new nazimHikmet(); //Class bir değişkene tanımladık. $class->yazdir(); //Sabit değişkeni ekrana basan metodu çağırdık. |
Evet arkadaşlar tabi php nesne tabanlı programlama burada son bulmuyor. Sitemizde php kategorisini seçerek php oop hakkında diğer yazılarımı okumanızı öneririm. BAŞARILAR.