PHP’de Objeye Yönelik Programlama (Object Oriented Programming)

PHP’de Objeye Yönelik Programlama (Object Oriented Programming) Öne Çıkarılmış Görsel MEDEN

PHP’de Objeye Yönelik Programlama (Object Oriented Programming)

Nesneye Yönelik Programlama ve Yararları

PHP’de Objeye Yönelik Programlama (Object Oriented Programming) MEDEN 1Nesneye yönelik programlama 1990’lı yılların ve günümüzün teknolojisidir ve büyük olasılıkla yakın gelecekteki programlama teknolojisi olmaya da devam edecektir. Nesneye yönelik programlama, artık, 1970’lerdeki yapısal programlama (Structured Programming) yerini tamamı ile almıştır. Nesneye yönelik programlamada, programlama ortamındaki her şey bir nesne olarak kabul edilmekte, nesnelerin özellikleri (Properties) değiştirilerek onlara yeni biçimler verilebilmektedir. Ayrıca her nesnenin duyarlı olduğu olaylar (events) mevcuttur. Her nesne üzerine uygulanabilecek farklı metotlar (methods) oluşturulmuştur. Yapısal programlamada ağırlık programlama komutlarında iken, Nesneye yönelik programlamada yazılımcının ortamdaki nesneler, özellikleri, hassas oldukları olaylar ve nesnelere uygulanabilecek metotlar hakkında da detaylı bilgi sahibi olması gerekmektedir.

PHP’de Objeye Yönelik Programlama (Object Oriented Programming) MEDEN1980’lerin ortasında ortaya çıkan C++, ilk nesneye yönelik programlama dili değildi ama en popüleri olmuştu ve bilindiği C dilinin, class(sınıf) yapısı ilave edilmiş ve nesneye yönelik programlama teorisinin kavramlarına göre tasarlanmış ve yeni sürümü idi ve çok yaygın olarak kullanıldı ve kullanılmaya da devam ediyor. 1990’ların başında, özellikle Internet uygulamalarına yönelik özellikleri ile öne çıkan Java dili de saf (pure) bir nesneye yönelik programlama dilidir. Şimdi, nesneye yönelik programlama dillerinin teknik özelliklerini gözden geçirmeden önce, yukarda belirtilen nesneye yönelik dillere yönelimin nedeninni anlayabilmek için, nesneye yönelik programlama dillerinin yararlı taraflarını gözden geçirmek uygun olacaktır.

Yazılımın Bakım (Maintenance) Kolaylığı

Nesneye yönelik programlama dillerinde, nesneler ait oldukları sınıfların sunduğu şablonlarla temsil edilirler. Birbirine benzer ya da aynı konu ile ilişkili sınıflar ise bir araya getirilerek names pace ya da package (paket) adı verilen sınıf kümeleri oluşturulur. Bu durumda, yazılımın bakımı demek, ya mevcut sınıflarda değişiklik ya da yeni sınıf eklenmesi anlamına gelir ki bu da yazılımın tümünü hiç bir şekilde etkilemeyecek olan bir işlemdir. Oysa klasik yapısal programlama dilleri ile geliştirilen yazılımlarda yazılımın bakım maliyeti üretim maliyetinin çok önemli bir yüzdesi kadardır (%40’lar civarında).

Genişletilebilirlik (Extensibility)

Nesneye yönelik programlamada mevcut bir sınıfa yeni özellik ve metotlar ekleyerek artan işlevsellik sağlamak oldukça kolay bir işlemdir.

Üretilen Kodun Yeniden Kullanılarbilirliği (Reusability)

Nesnelerin üretildiği sınıflar, ortam içinde her uygulama geliştiricinin kullanımına açık olduğu için ortak bir kütüphane oluşturulmuştur. Her kullanıcı bu ortak kütüphanede bulunan sınıfları kullanarak gerekli kodu yeniden yazmaktan kurtulur ve uygulamaya özgü kod parçaları, ortak kullanımdaki sınıfların kod uzunluklarına göre önemsiz boyuttadır.

PHP’de Sınıflar (Classes) ve Nesneler (Objects)

Sınıf yapısının varlığı nesneleri oluşturma imkanı sağlamaktadır. Nesneye yönelik programlamada sınıf yapısı olmasa nesneye yönelik programlamadan da bahsedilemezdi.

PHP’de sınıf oluşturmak için aşağıdaki yazılış biçimi kullanılır:

<?php

class IlkSinif

{

// Sınıfa ait özellikler (properties) ve metotlar (methods)

}

?>

Bir sınıf tanımladıktan sonra o sınıftan bir nesne (object) oluşturmak mümkündür ve bu işlem new sözcüğü ile gerçekleştirilir:

$nesne1=new IlkSinif;

Nesnenin içeriğini görmek içinse var__dump fonksiyonunu kullanabilirsiniz:

var_dump($nesne1);

Sınıf Özelliklerinin Tanımlanması

Yukarda oluşturduğumuz sınıfın renk ve içerik adlı iki tane özelliğin bulunduğunu var sayalım. Bu özellikleri tanımlamak için aşağıdaki syntax kullanılmalıdır:

<?php

class

{

public $renk= ”KIRMIZI”;

public $icerik= ”MERHABA”;

$nesne = new IlkSinif;

var_dump($nesne);

?>

IlkSinif adlı sınıftan oluşturulan nesne adlı nesnenin özelliklerini görüntülemek için aşağıdaki notasyon kullanılmalıdır:

echo $nesne->renk;

echo $nesne->icerik;

Aşağıdaki PHP programı ise IlkSinif adlı sınıfı ve özelliklerini tanımlamakta, özelliklere değer atamakta ve özelliklerin değerlerini listelemektedir:

<?php

classIlkSinif

{

public $renk= ”KIRMIZI”;

public $icerik=”MERHABA”;

}

$nesne = new IlkSinif;

echo $nesne->renk;

echo $nesne->icerik;

?>

Sınıfa Ait Metotları Tanımlamak

Bir sonraki adım sınıfa ait metotları (başka bir deyişle fonksiyonları) tanımlamaktır.

<?php

class IlkSinif

{

public $renk = ”KIRMIZI ;

public $icerik= ”MERHABA”;

public function renkAta($yd)

{

$this->renk = $yd;

}

public function rental()

{

return $this->rank ”<br/>”;

}

public function icerikAta($yde)

{

$this->icerik = $yde;

}

public function icerikAl()

{

return $this->icerik ”<br/>”;

}

}

$nesne= new IlkSinif;

echo $nesne->renk;

echo $nesne->icerik,

?>

Aşağıdaki kod ise nesnenin mevcut renginin görüntülenmesi, yeni bir renk atama ve mevcut renge erişilmesi gibi işlemleri gerçekleştirmektedir.

<?php

classIlkSinif

{

public $yd= ”KIRMIZI”;

public function renkAta($yd)

{

$this->renk=$yd;

}

public function renkAl()

{

return $this->rank. ”<br />”;

}

}

$nesne= new IlkSinif;

echo $nesne->renk()

$nesne->renkAta (”MAVİ) ;

echo $nesne->renkAl();

?>

Örnek:

Aşağıdaki Daire adlı sınıf, Yaricap adlı bir özelliği ve Alan ile Cevre adlı iki metodu ile gösterilmiştir.

SINIF(CLASS)-> Daire

ÖZELLİK-> Yaricap

METOT-> Alan

METOT-> Cevre

Bu sınıfı oluşturmak için aşağıdaki PHP kodu yazılabilir.

<?php

class Daire

{

public $yaricap=3;

public function ycAta ($yd)

{

$this>-yaricap=$yd;

}

public function cAl()

{

return $this-> yaricap. ”<br />”;

public function Alan()

{

return $this->yaricap*$this->yaricap*3.14159 . ”<br />”;

}

public function Cevre()

{

return 2*33.14159 *$this->yaricap .”<br />”;

}

}

$d1= new Daire;

echo $d1->yaricap

#d1-> ycAta (5) ;

echo $d1->ycAl();

echo $d1->Alan();

echo $d1->Cevre();

?>

Soyutlama (Abstraction)

Soyutlama denilince, nesneyi, bazı karakteristikleri olan ve bazı eylemleri gerçekleştirebilen bir veri tipi olarak genelleştirmek anlaşılmalıdır. Yeryüzü üzerinde bulunan her şey bir nesnedir. Bilgisayar yazılımı açısından nesne, bir varlığın temsil biçimidir. Örneğin, bir bina bir nesnedir. Binayı bilgisayar yazılımı içinde temsil etmek istersek, öncelikle, bu nesnenin yani binanın ayırdedici özelliklerini belirlemeliyiz. Örneğin, bina yüksekliği, dış yüzey rengi, kat sayısı, zemin alanı, zemin boyutları gibi özellikler, binayı temsil etmek için ilk akla gelen birkaç özelliktir.

O halde nesnenin bilgisayarda temsilin,de özellikleri (properties) kilit rol oynamaktadır. Nesnenin karakteristikleri özellikler (properties) ve gerçekleştirebileceği eylemlerde metot (method) adını alır. Bu anlamda, soyutlaştırmanın sonucunda bir nesne, metotları ve özellikleri ile temsil edilebilir.

Nesneye yönelik programlama dilleri, soyutlamayı, sınıf (class) yapısı ile gerçekleştirirler. Sınıf yapısı içinde o nesneye ait özellikler ve metotlar tanımlanabilir. Ancak sınıf soyut bir yapıdır ve doğrudan kullanılamaz. O sınıftan üretilen örnekler (instance) sınıfa ait tüm özelliklere ve metotlara sahip olurlar ve bunlar program içinde doğrudan kullanılabilirler. Sınıftan üretilen her örnek, aynı özellik ve metotlara sahip olacak ancak özelliklerin değerleri doğal olarak farklı olabilecektir.

Örneğin, insan bir nesne olarak düşünülürse ve insan sınıfı olarak soyutlanırsa, ilk akla gelen özellikleri, boy, kilo, IQ ve EQ değerleri, Eğitim düzeyi vb özelliklerdir ve bunların değerleri doğal olarak her insan için farklıdır. İnsan için ilk akla gelen eylemler (metotlar) ise, yürüme, oku-ma yazma, konuşma, araç kullanma vb metotlardır.

Paketleme (Encapsulation)

Paketlemenin anlamı, sınıfı oluşturan metot ve özelliklerin gerçekleştirim biçiminin, bu sınıfı kullanacak olan kullanıcılardan gizlenmiş olmasıdır.

NESNE=VERİ+METOTLAR

Şeklinde ifade edilen bağıntı aslında nesneye yönelik programlamanın esasını açıklamaktadır. Veri (özellikler) ve veri üzerinde işlem yapan kod (metotlar) bir arada bulunur ve nesneyi oluşturur. Nesneyi tanımlayan sınıfın iç ayrıntıları, normal olarak programın arta kalan kısmı için görünür değildir. Bir nesne sınıfının gerçekleştirimini değiştirirseniz yani aynı sınıfı metot ve özellikleri aynı kalmak koşulu ile farklı bir programlama tekniği ile oluşturursanız, o sınıfın dış dünyaya olan arayüzü değişmediği sürece (yani metot ve özellikler aynı kaldığı sürece) bu sınıfı kullanan program kodlarınızda bir değişiklik yapmanıza gerek kalmayacaktır.

Miras Alma (Inheritance)

Nesneye yönelik programlamada, bir nesne, genellikle, bir nesne sınıfına ait bir örnektir (instance). Örneğin, Albert Einstein, insan sınıfının bir örneğidir. Bir nesne sınıfından alt sınıflar (subclasses) oluşturabiliyorsa, türetme özelliği (derivation) var demektir. Örneğin insan sınıfı) canlı sınıfının bir alt sınıfıdır. Kendisinden alt sınıf üretilen sınıfa, temel sınıf (base class) veya süper sınıf (super class) veya ebeveyn sınıf (parent class) adı verilir. Alt sınıf (subclass) yerin çocuk sınıf (child class) terimi de kullanılmaktadır.

Alt sınıfın nesneleri, türetildikleri temel sınıfa ait özellikleri alıyorsa, burada miras alma (inheritance) özelliği vardır denir. Bu anlamda, inheritance özelliğine sahip olan bir nesneye yönelik programlama dilinde, bir nesne sınıfından türetilen alt nesne sınıfına ait nesneler, üst sınıfın özelliklerinin (properties) ve metotlarını (methods) aynen alırlar. Sınıf türetebilme imkanı sayesinde bir nesne hiyerarşisi oluşturma imkanı doğmaktadır.

Örnek:

Aşağıdaki uygulama, miras alma (inheritance) işleminin PHP içinde somut olarak nasıl gerçekleştirilip kullanılabileceği konusunda gayet net bir fikir vermektedir. Bu uygulamada dikdörtgen adlı bir sınıf türetilmektedir. Böylece Dik bir alt sınıf (subclass, child) olmaktadır. Dikdörtgen ise temel sınıftır (base class, parent, super class). Dik sınıfı dikdörtgen sınıfının tüm özellik ve metotlarını miras alacaktır ayrıca kendine özgü metotları da olabilir. Gerçekten de dik sınıfı köşegen adlı kendisine ait bir sınıfa da sahiptir.

Şimdi aşağıdaki adımları izleyiniz:

Aşağıdaki PHP kodunu oluşturunuz:

<?php

class DikDörtgen

{

public $Genişlik ;

public $Uzunluk;

public function Alan()

{

return $Genislik * $Uzunluk;

}

public function cevre()

{

return 2* ($Genislik + $Uzunluk);

}

}

class Dik extends DikDortgen/*inheritance gerçekleşiyor*/

{

public function kosegen()

{

return pow(($this->Genislik *$this->Genislik + $this->U<unluk *$this->Uzunluk),0.5);

}

}

$dd= new Dikdortgen;

$dd-> Genislik = 5;

$dd-> Uzunluk = 8;

echo GENISLIK=”, $dd->Genislik. ”<br/>”;

echo ”UZUNLUK=”,$dd->Uzunluk. ”<br/>”;

$ddk=new Dik;

$ddk->Genislik = 7;$ddk->Uzunluk=10;

echo ”GENISLIK=”, $ddk->Genislik. ”<br/>”;

echo”UZUNLUK=”,$ddk->Uzunlukk. ”<br/>”;

echo ”KOSEGEN=”,$ddk->kosegen(). ”<br/>”;

?>

Self ve Parent Komutları

Bir sınıfın içinde bir metot ya da değişkenden önce SELf sözcüğü kullanılırsa sınıf içinde sadece o sınıfa ait değişken ve metotlara erişilebilir; PARENT sözcüğü sayesinde de ebevyn sınıftaki aynı tip verilere erişilebilir.

Örnek:

Aşağıdaki kodu oluşturunuz:

<?php

class DikDorgen

{

public $Genislik;

public $Uzunluk;

public unction alan ($Genislik, $Uzunluk)

{

return $Genislik * $Uzunluk;

}

public function cevre ($Genislik, $Uzunluk)

{

return2* ($Genislik + $Uzunluk)

}

}

class Dik extends DikDortgen

{ public function _construct()

{

$k=self::kosegen(3.0, 4.0);

echo ”KOSEGEN=”, $k;

$a=parent::Alan (3,4)

echo” ALAN=” , +a

}

public function kosegen($Genislik, $Uzunluk)

{

return sort(($Genislik *$Genislik + $Uzunluk *$Uzunluk));

}

}

$d=new Dik;

echo” KOSEGEN=” , $d->kosegen (3,4);

Kodu çalıştırdığınızda aşağıdaki sonucu elde edeceksiniz:

KOSEGEN=5 ALAN=12 KOSEGEN=5

Çok Biçimlilik (Polymorphism)

Farklı nesnelerin, aynı mesaja (olaya ya da uyarıma) farklı şekillerde cevap verebilme yeteneğidir. Her nesne sınıfı, kendi metotlarını paketlediği için ve bu metotlar programın arta kalan kısmı için giz olduğundan farklı sınıflar aynı isimde bazı metotlara sahip olabilirler.

Örnek:

Aşağıdaki PHP kodu içinde YASARKEMAL ve RESAtNURI adlı sınıflar KITAp adlı sınıftan türetilmiş olup her biri aynı isim ve farklı içerikte metotlar (içerik)())taşımaktadır:

<?php

class KITAP

{

}

class YASARKEMAL extends KITAP

{

public function icerik()

{

return (”YAŞAR KEMAL: DESTANLARI ANLATIRKEN DESTANLAŞAN YAZARIMIZ::::”);

}

}

class RESATNURI    extends KITAP

{ public function içerik()

{

return (”REŞAT NURİ: BİZİ EN İYİ ANLAYAN VE ANLATAN BİR YAZARIMIZ…”);

}

}

$kl=new YAŞARKEMAL;;

ec$kl->icerik(). ”<br/>”;

$k2= new RESATNURI;

echo $k2->içerik().”<br” ;

?>

Kodu çalıştırdığınızda aşağıdakini elde edeceksiniz.

YAŞAR KEMAL: DESTANLARI ANLATIRKEN DESTANLAŞAN YAZARIMIZ…

REŞAT NURİ: BİZİ EN İYİ ANLAYAN VE ANLATAN BİR YAZARIMIZ…

Statik Sınıf Üyeleri

Statik sınıf üyeler, o sınıftan üretilmiş herhangi bir nesne olmaksınız da kullanılabilen sınıf değişkenleridir. Bunlar static sözcüğü ile tanımlanırlar. Örneğin, aşağıdaki ORAN sınıfında bu türde 4 değişken (veror1, veror2, veror3, veror4) tanımlanmıştır:

Örnek:

Gelir vergisi için uygulanacak vergi oranının aşağıdaki kurallara göre belirlendiğini varsayalım:

Gelir<=150, 000, 000 ise %25

Gelir<=300,000,000 ise %30

Gelir<=600,000,00 ise %35

Gelir<=1,200,000,000 ise %40

Gelir<1,200,000,000 ise %50

Buna göre, bu bilgiler ışığında gelir vergisini hesaplayan bir php fonksiyonu yazacağız.

Construct ve Destruct Metodları

Construct metodu, tanımlanan bir sınıftan yeni bir nesne oluşturulduğu zaman otomatik olarak icra edilen özel metottur.

Örnek:

<?php

class DD

{     function_construct()

{

echo ”YAPICI (CONSTRUCTOR) ÇALIŞTI” ;

}

}

$s=new DD;

?>

Yukardaki PHP kodunu çalıştırdığınızda aşağıdaki kodu elde edersiniz.

YAPICI(CONSTRUCTOR) ÇALIŞTI

DD sınıfından new sözcüğü ile $s adlı nesne oluşturulur oluşturulmaz, construct metodu otomatik olarak devreye girerek echo komutunu icra etmiş ve yukardaki mesajı vermiştir.

construct metodu özel bir fonksiyon olup önüne iki adet alt çizgi sembolü koymak gerekir:

_construct()

{}

_destruct metodu ise sınıftan oluşturulan nesne yok edildiği ya da ilgi alanından çıktığı anda otomatik olarak devreye girer.

Örnek:

Aşağıdaki kodu yazın ve çalıştırın:

<?php

class DD

{ function _construct()

{

echo ”YAPICI (CONSTRUCTOR) ÇALIŞTI…<br >”;

}

function _destruct()

{

echo ” s nesnesi ilgili alanından çıktı …. ”;

}

}

$s=new DD;

?>

Aşağıdakini elde edeceksiniz:

YAPICI(CONSTRUCTOR) ÇALIŞTI…

s nesnesi ilgi alanından çıktı…

Overriding (Geçersiz Kılma)

Bir sınıftan başka bir sınıf üretildiğinde, temel sınıftaki bir metot aynı isim ile çocuk sınıf veya alt sınıfta da kullanılırsa buna overriding (geçersiz kılma, ağır basma) adı verilmektedir.

Örnek:

Aşağıdaki PHP kodunu oluşturunuz:

<?php class DikDortgen

{ public $Genislik ;

public $Uzunluk;

public function Alan ($Genislik, $Uzunluk

{

return $Genislik* $Uzunluk);

}

return 2* ($Genislik + $Uzunluk);

}

public function mesaj()

{

echo ”DİK DMRTGEN SINIFI…<br >”İ

}

}

Class Dik extends DikDortgen

{

public function _construct()

{

$k=self::kosegen(3.0,4.0);

echo”KOSEGEN=”, $k;

$a=parent::Alan(3,4)  ;

echo ‘ ALAN=” , $a;

}

public function kosegen ($Genislik, $Uzunluk)

{

return sort (( $Genislik* Genislik + $Uzunluk *$Uzunluk));

}

public function mesas()

{

echo ”<br> DİK SINIFI…<br>”;

}

}

$d=new Dik;

echo ” KOSEGEN=”, $d->kosegen (3,4);

$e=new DikDorgen() ; $d->mesas(); $e->mesaj();

?>

Kodu çalıştırınca aşağıdakini elde edersiniz:

KOSEGEN=5 ALAN=12 KOSEGEN=5

DİK SINIFI…

DİK DÖRTGEN SINIFI

Kolayca görüldüğü gibi mesaj adlı fonksiyon hem DikDortgen sınıfında hem de Dik sınıfında tanımlanmıştır.

Object Interface (Nesne Arayüzü)

PHP’de Interface yapısı, bir sınıfa ait metotların bildirimi için kullanılır. Interface içinde metotlar isim ve parametreleri ile bildirilir ancak metotların ayrıntılı kodunu yerleştirmek gerekmez.

Örnek:

Interface XX {

public function Top ($a, $b) ;

public function CIK ($a, b) ;

public function CARP ($a, $b) ;

public function BOL($a, $b) ;

}

Yukarıdaki XX adlı interface TOP,CIK, CARP, ve BOL adlı metodları bildirmektedir.

Aşağıdaki ARIT adlı sınıf ise bu metodları kullanıyor: class ARIT implements XX {

public $a;

public $b;

public function Top($a, $b)

{

echo ”TOPLAM=” ,$a+$b.”<br >”;

}

public function CIK ($a, $b)

{ echo” FARK=”, $a-$b. ” <br>”;

}

public function CARP ($a, $b)

{

echo ”ÇARPIM=”, $a*$b.”<br>”;

}

public function BOL($a, $b)

{

echo ”BÖLÜM=”, $a/$b.”<br>”;

}

}

Kodun çıktısı ise aşağıda görülmektedir:

TOPLAM=15

FARK=-5

ÇARPIM=50

BÖLÜM=0.5

Namespace Kavramı

Namespace yapısı sayesine PHP kodu içinde nispeten bağımsız kod parçaları oluşturulabilir. Her namespace’in kendisine ait sabitler, sınıflar metotları olabilir. Farklı namespace’ler içinde aynı isimli metodlar kullanılabilir. Aşağıdaki kodda A ve B isimli iki ayrı namespace tanılanmakta, her ikisinde de mesaj adı birer metod bulunmaktadır. Kodu inceleyerek bunların nasıl kullandığını öğreniniz.:

<?php

namespace A(

class D(

function mesaj()

{

echo ”NAMESPACE A<br >” ;

}

}

}

namespace B {

class F (

function mesaj ()

{

echo ”NAMESPACE B” ;

}

}

}

namespace {

$d=new A\D ;

$d-> mesaj();

$e=new B\F;

$e-> mesaj();

}

?>

Yukarıdaki kod icra edilince;

NAMESPACE A

NAMESPACE B

Public, Private, Protected Reserve Sözcükleri

Nesneye Yönelik programlamanın en tipik özelliklerinden biri de sınıf elemanlarına sınıf dışından erişimlerin tamamen kontrol altında tutulabilmesidir. PHP içinde aşağıdaki erişim biçimleri mevcuttur.

Public

Bu türde tanılanmış bir sınıf bileşeni üzerine erişim bakımından bir kısıt konulmamıştır. Bu sınıf bileşenine kod içinde herhangi bir yerden erişilebilir.

Private

Bu türde tanılmanmış olan sınıf bileşenlerine sadece o sınıf içinden erişilebilir.

Protected

Bu türde tanımlanmış olan sınıf bileşenlerine sadece sınıf içinden ve bu sınıftan türetilmimş sınıf içinden erişilebilir. Default durum public’tir.

 

 

Bu gönderiyi paylaş

Bir cevap yazın