Post Job Free
Sign in

Class B A

Location:
Kirikkale, Turkey
Posted:
July 26, 2023

Contact this candidate

Resume:

PHP

Object Oriented

Programming

(OOP)

Emrullah TANIMA

Hakkımda

** ***** **** ****/***** doğumluyum. İlk ve orta eğitimimi doğup büyüdüğüm ilçede bitirdim. Lise eğitimimi İstanbul Hadımköy Toki Lisesinde bitirdim. Ordu Üniversitesi Bilgisayar Programcılığı mezunuyum.

Çok küçük yaşlardan beri bilgisayar, internet ve müzikle uğraşıyorum. Ağırlık olarak Web Yazılım, Nesne Tabanlı Programlama ve VTYS (Veritabanı Yönetim Sistemleri) alanlarında proje üretiyor veya mevcut projeleri geliştiriyor ya da teknik destek sunuyorum. Web yazılım olarak 7 yıldır PHP kullanıcısı, Nesne Tabanlı olarak ise 4 Yıldır Java kullanıcısıyım. Üniversite yıllarında birkaç geliştirici arkadaşla ortak bir yazılım şirketi kurup daha sonra bazı sebeplerden dolayı kepengi kapattık. Şu an freelancer olarak çalışıyorum ve böyle daha mutluyum. Müzik dalından bahsedecek olursak genelde yaz aylarında kafe, türkü bar, restorant ve düğünlerde şarkı söylüyorum. Gitar, Bağlama ve Org enstrümanlarıyla aram çok iyidir. Elimden geldiği kadar ve işlerden fırsat buldukça boş zamanlarımda müzikal anlamda bir şeyler yapmaya çalışıyorum.

Üzerimde emeği geçen herkese başta üniversite hocalarım ve özel kurs hocalarım olmak üzere herkese ayrı ayrı teşekkür ediyorum.

Tüm sorularınız ya da herhangi bir şey için ****@**************.***, ******@*****.*** adresinden yada sosyal medya hesaplarımdan bana ulaşabilirsiniz.

Önsöz

Kişisel bloğum üzerinde yayınladığım yazıların site üzerinde çok dağınık durması araya başka konuları girmesi gibi sebeplerden dolayı bu yazıları bir kitap haline getirmek ve bu konuda ki kaynak sıkıntısına bir nebze de olsa katkıda bulunmak istedim.

Blog üzerinde ki içeriklerden farklı olarak ufak tefek değişiklikler ve eklemeler yaptım. Konuyu daha iyi özümseyeceğinizi düşündüğüm birkaç tane de örnek ekledim. Kitap içeriğinde ki yazım ve imla hataları, kod hataları ya da yanlış olduğunu düşündüğünüz her hangi bir şeyi bana iletirseniz çok memnun olurum. Böylelikle amacına daha uygun bir kitap olmuş olur ve yanlış bilgi vermenin de önüne geçmiş oluruz.

Faydalı olması dileğiyle…

Bu kitap kimler için ?

Bu kitap PHP Object Oriented Programming Türkçe manasıyla nesne tabanlı programlama hakkında bilgiler içerir. Kitapta anlatılan konuları anlayabilmek için genel programlama bilgisine ve yeteğine sahip olmak, PHP temel yazım kuralları(syntax)nı bilmek yeterlidir.

Hiçbir zaman PHP diline ait konuların; temel php dersleri, orta seviye php dersleri, ileri seviye php dersleri gibi saçma sapan kategorilere ayrılmasından yana değilimdir. Zira bir programlama dilinin öğrenilmesi gerekiyor ise bütünüyle öğrenilmesi taraftarıyım. İçindekiler

1. Giriş 1 1.1. Giriş 1 1.2. Sınıf nedir nasıl oluşturulur? 2 1.3. Yapıcı ve yıkıcı metot nedir? 4 2. Gizlilik 6 2.1. Public 6 2.2. Private 8 2.3. Protected 10 2.4. Static 12 2.5. Final 14 3. Sihirbaz Metotlar 17 3.1. __construct 17 3.2. __destruct 18 3.3. __toString 19 3.4. __call 20 3.5. Örnek Sınıf 20 4. Autoload 26 5. Overloading 28 6. Soyut Sınıflar 31 7. Nesne Arayüzleri 34 7.1. Giriş 34 7.2. Nesne arayüzleri neden kullanılır? 35 8. Nesne Klonlama 37 9. Sonsöz 38

@author Emrullah Tanıma Sayfa 1

1.1 Giriş

OOP Object Oriented Programming kelimelerinin baş harflerinden oluşan bir programlama teknolojisidir. Türkçe manasıyla söyleyecek olursak Nesne Tabanlı Programlamadır. OOP teknolojisi kullanılan programlama dillerine en güzel örnek Visual Basic ve JAVA’dır. OOP teknolojisi kullanılan programlama dilleri tabi ki bu iki güzel örneğimiz ile sınırlı değil. Örneğin: Objective-C, C#, C++, Python ve tabii ki PHP.

Eğer yukarıdaki dillerden herhangi birini biliyorsanız PHP ile nesne tabanlı programlama mimarisine aşina olmanız çok kolay olacaktır. PHP nesne tabanlı programlama mimarisine tam olarak PHP 5 ile geçmiştir. PHP4 de obje (nesne) yapısı vardı ancak ihtiyaçları pek karşılamıyor ve modern yapıya pek ayak uyduramıyordu. Ancak PHP5 ile gerçek manada bir OOP mimarisi PHP diline eklendi.

PHP OOP mimarisini kullanarak daha profesyonel, daha esnek ve daha geliştirilebilir projeler oluşturabiliriz. Günümüzde artık tüm web teknolojilerinde OOP mimarisi kullanılıyor. Profesyonel olarak oluşturulan projeler bile OOP mimarisine dönüştürülüyor. Sizin de bugünden itibaren OOP mimarisine geçmemeniz için hiç bir sebep yok. OOP mimarisinin sizi cezbedeceğini düşündüğüm bir kaç örnek vereyim.

Örneğin basit bir blog scripti yazdınız. Burada blog yazılarınızı yayınlıyorsunuz. Scriptinize yorum özelliği gibi bir kaç tane de özellik eklediniz. Projeniz bitti ve arşive attınız. Daha sonra farklı bir proje için yine yazı ekleyip çıkarabileceğiniz daha ufak bir blog modülüne ihtiyacınız oldu. Bu durumda o proje için yeniden yazmak yerine daha önce yazmış olduğunuz yazılar modülü kullanabilirsiniz. Daha açık örneklemek gerekirse bugün yazmış olduğunuz bir modülü, eklentiyi, sınıfı ömür boyu çok daha kolay ve basit bir şekilde projenize dahil edebilirsiniz. Bu olay kod yazmadan proje çıkarmaya kadar gider.

PHP projelerinizde OOP mimarisini kullanmanızın bir diğer faydası da her şey yerli yerindedir. Bir de mvc mimarisini kullandığınızda 10 yıl sonra bile projeyi açtığınızda neyin nerede olduğunu çok rahatlıkla bulabilir çok daha profesyonel projeler oluşturabilirsiniz.

@author Emrullah Tanıma Sayfa 2

PHP ile OOP mimarisini kullanarak proje geliştirmek için bazı terimleri bilmemiz gerekiyor. Diğer dillerde olduğu gibi PHP dilinde de OOP mimarisi sınıf, fonksiyonlar(metot) ve parametreler üzerine kuruludur. 1.2. Sınıf nedir nasıl oluşturulur?

Sınıf (class) birçok fonksiyonu bir düzen içerisinde barındıran yapılardır. OOP mimarisinin temelidir diyebiliriz. Blog örneğimizden yola çıkarak bir yazı sınıfının içinde yazı ekleme, yazı silme, yazı düzenleme gibi fonksiyonlar bulunur. Sınıflar hakkında detaylı bilgiye http://php.net/manual/tr/language.oop5.php buradan ulaşabilirsiniz.

Sınıf tanımlamak için class komutunu kullanırız. Yukarıdaki örneğimizden devam ederek yazılar adında bir sınıf oluşturalım.

<?php

class yazilar {

// php oop dersleri

}

>

Sınıflar tıpkı fonksiyonlar gibi çağrılmayı beklerler. Bir sınıfı çağırmak için New komutu kullanılır. Bu komutumuzun baş harfinin küçük yada büyük olması herhangi bir farklılık yaratmaz. İki şekilde de kullanabiliriz. Yukarıdaki yazılar sınıfımızı çağırmak için:

<?php

new yazilar ;

>

Yazmamız yeterlidir. Şu an yazılar sınıfımızı çağırdık ancak hiç bir değişiklik olmadı. Çünkü biz sınıfımıza ait bir metot tanımlamadık ve o metodu çağırmadık.

@author Emrullah Tanıma Sayfa 3

Sınıfımıza merhaba adında bir fonksiyon ekleyelim ve bu fonksiyon ekrana

“Merhaba” yazsın. Bir sınıfa fonksiyon eklemek için public function komutunu kullanırız. (Şimdilik )

<?php

class yazilar {

public function merhaba {

echo "Merhaba";

}

}

>

Şimdi yazılar sınıfını bir değişkene atayıp çağıralım.

<?php

$oop = new yazilar ;

>

Yazılar sınıfımız şu an çalışıyor. Bizim ekrana “Merhaba” yazmasını istediğimiz fonksiyonu çağırmadığımız için sınıfı çağırdığımız halde herhangi bir değişiklik olmadı. Bir sınıf altındaki fonksiyonu çağırmak için -> işaretini kullanılırız. Yazılar sınıfımızdaki merhaba fonksiyonunu çağırmak için:

<?php

$oop = new yazilar ;

$oop->merhaba ;

>

Şeklinde kullanmamız gerekir.

Özetle ne yaptığımıza bir bakalım. class komutunu kullanarak yazilar adında bir sınıf oluşturduk. Daha sonra New komutuyla sınıfımızı çağırdık. Ardından public function komutu ile sınıfımıza merhaba adında bir fonksiyon tanımladık.

@author Emrullah Tanıma Sayfa 4

Son olarak da -> işaretiyle çağırdığımız sınıfımızın merhaba fonksiyonu çalıştırdık. Kodlarla anlatmak gerekirse :

<?php

class yazilar {

public function merhaba {

echo "Merhaba";

}

}

$oop = new yazilar ;

$oop->merhaba ;

>

1.3. Yapıcı ve yıkıcı metot nedir?

Sınıfların ana metotları bir diğer adıyla yapıcı ve yıkıcı metotları bulunur. Bu ana metotlar __construct ve __destruct metotlarıdır. Bu arkadaşlardan __construct yapıcı, __destruct ise yıkıcı metot olarak bilinir. Yapıcı metot sınıf çağrıldığı anda çalışan metottur. Yani New sinifadi ; diyerek bir sınıfı çağırdığınızda hiç bir metot belirtmeseniz bile çalışacak olan metottur.

Yıkıcı metot ise en son işlem bittiğinde çalışacak olan metottur. Yapıcı ve yıkıcı metot tanımlarken de public function komutunu kullanırız. Kısa bir örnekle konuya açıklık getirelim.

<?php

class anametot {

public function __construct {

echo "Sınıf çalıştı";

}

@author Emrullah Tanıma Sayfa 5

public function __destruct {

echo "Sınıf bitti";

}

}

new anametot ;

>

Ekran çıktısı: Sınıf çalıştıSınıf bitti

Burada bir püf noktaya değinmek istiyorum. Eğer yapıcı metot parametre alıyorsa sınıfı başlatırken bu parametreleri girmek zorundayız. Örnek:

<?php

class anametot {

public function __construct($arg){

echo $arg;

}

}

new anametot('parametre değeri');

>

Eğer yapıcı metot parametre almıyorsa parantez kullanmadan da sınıfı çağırabiliriz. Yukarıda ki örneğimiz de ki yapıcı metodumuz parametre almamış olsaydı. New anametot; diyerek de sınıfı başlatabilirdik.

Yapıcı ve yıkıcı metotlar nerelerde kullanılır ?

Sınıfın çalışması için gerekli bilgiler varsa bu bilgiler yapıcı metoda gönderilir. Yada sınıf çalışmadan önce bazı işlemler yapılması gerekiyorsa kullanılır. Sınıf bitince silinmesi gereken değerler varsa bunlarda yıkıcı metotta halledilir. Mesela bir veri tabanı sınıfını başlatmak için sunucu adresi, kullanıcı adresi gibi bilgiler yapıcı metoda gönderilir.

Yapıcı ve yıkıcı metotları tanımlamak zorunlu değildir. Ancak ilerleyen konularda ve OOP mimarisini kavradığınızda çok fazla faydasını göreceksiniz.

@author Emrullah Tanıma Sayfa 6

2. Gizlilik

OOP mimarisinde gizlilik: sınıf içerisinde kullanılan sabit değişkenlerin ve metotların nerelerden erişilebileceğinin belirlenmesidir. Bir diğer deyişle sınıf içerisinde kullanılan tüm argümanların güvenliğinin belirlenmesidir. Bir proje üzerinde birden çok yazılımcı çalıştığında, yazılımcıya erişebileceği ve erişemeyeceği sabit değişkenler ve metotlar tanımlayarak yanlış kullanımların önüne geçmiş oluruz.

PHP’nin bize sunmuş olduğu 5 adet gizlilik komutu bulunmaktadır. Bu komutlarımız public, private, protected, static, ve final komutlarıdır. 2.1. Public

Public komutuyla oluşturulan tüm sabit değişken ve metotlara her ortamdan erişilebilir. Örnek:

<?php

class OopDersleri {

public function __construct {

}

public function merhaba {

echo "Merhaba";

}

}

$oop = New OopDersleri ;

$oop->merhaba ;

>

Bir önceki konumuza hatırlatma olması amacıyla ne yaptığımıza bir bakalım.

@author Emrullah Tanıma Sayfa 7

Class komutuyla yeni bir sınıf oluşturduk. public function komutuyla erişilebilir bir metot tanımladık. $oop değişkenine New komutuyla tanımladığımız sınıfı atadık. Ve son olarak da $oop->merhaba koduyla da sınıfımız içinde ki merhaba adlı metodu çalıştırdık.

Bu arada sınıf içerisinden yada sınıf dışından erişilebilme de nedir diye soracak olursanız hemen ona da bir açıklık getirelim.

Yukarıdaki örneğimiz sınıf dışından erişime örnektir. Şöyle ki biz önce sınıfımızı yazdık daha $oop adında bir değişken oluşturup New komutuyla sınıfı başlattık. Daha sonra da $oop->merhaba ; koduyla da sınıfın merhaba metoduna eriştik. Eğer ki merhaba metoduna sınıf içinden erişmeye çalışmış olsaydık kodlarımız şu şekilde olmalıydı.

<?php

class OopDersleri {

public function __construct {

$this->merhaba ;

}

public function merhaba {

echo "Merhaba";

}

}

$oop = New OopDersleri ;

>

Burada dikkatinizi çektiği üzere $this adında bir komut kullandık. Sınıf içerisindeki public olarak tanımlanan bir metot veya sabit değişkene $this komutuyla erişebiliriz. Şimdide public bir argüman tanımlayalım. Kodlarımız:

@author Emrullah Tanıma Sayfa 8

<?php

class OopDersleri {

public $merhaba = "Merhaba";

public function __construct {

echo $this->merhaba;

}

}

$oop = New OopDersleri ;

>

Tekrar ne yaptığımıza bir bakalım.

OopDersleri adında bir sınıf oluşturduk. public $merhaba = “Merhaba”; ile public bir argüman oluşturduk ve __construct ana metodumuzda oluşturduğumuz argümanı ekrana bastık. Burada dikkat etmemiz gereken olay $this-> komutuyla sınıf içerisindeki bir argümana erişmek istersek argüman adından sonra kullanmıyoruz. Ancak bir metoda erişmek istersek parantez kullanmalıyız. 2.2 Private

Yalnızca sınıf içerisinden erişilebilen metot veya argüman oluşturmak istediğimiz zaman private komutunu kullanırız. Private olarak tanımladığımız bir metot veya argümana sınıf dışından yada türetilen bir sınıf dışından erişmemiz mümkün değildir. Türetilen sınıf da nerden çıktı diyecek olursanız birazdan açıklayacağım. Örneğimizdeki merhaba metodunu private olarak tanımlayalım.

<?php

class OopDersleri {

public function __construct {

}

private function merhaba {

@author Emrullah Tanıma Sayfa 9

echo "Merhaba";

}

}

$oop = New OopDersleri ;

$oop->merhaba ;

>

Bu kodumuzu çalıştırdığımızda fatal error (ölümcül hata) döndürecektir. Çünkü biz private olarak tanımladığımız bir metoda sınıf dışından ( $oop->merhaba erişmeye çalıştık.

Private olarak tanımlanan bir metot veya argümana sınıf içerisinden erişmek istediğimiz zaman yukarıda yeni öğrenmiş olduğumuz $this komutuyla yada self::metotadı şeklinde erişebiliriz. Yukarıdaki kodumuzun çalışan halini yazarak private olayımızı da halledelim.

<?php

class OopDersleri {

public function __construct {

self::merhaba ;

}

private function merhaba {

echo "Merhaba";

}

}

$oop = New OopDersleri ;

>

@author Emrullah Tanıma Sayfa 10

2.3. Protected

Protected komutuyla oluşturulan metot ve argümanlara yalnızca sınıf içerisinden ve türetilen sınıf içerisinden erişilebilir. Protected olarak tanımlanan bir metot veya argümana sınıf dışından asla erişilemez. Şimdi az önceki sözümüzü tutup türetilen sınıf nedir onu bir açıklayalım.

Bir sınıfı başka bir sınıftan türetmek için extends komutunu kullanırız. Örneğin a sınıfını b sınıfından türetmek için yazmamız gereken kod şudur:

<?php

class b {

public function merhaba {

echo "Merhaba";

}

}

class a extends b {

public function __construct {

parent::merhaba ;

}

}

$oop = New a ;

>

Peki, bir sınıfı bir başka sınıftan türetirsek ne olur ? Eğer bir sınıfı bir başka sınıftan türetirsek türetilen sınıf içerisinde ki (private komutuyla oluşturulanlar hariç) tüm metot ve argümanları türettiğimiz sınıf içerisinden de kullanabiliriz. a sınıfımızın __construct metoduna yazdığımız parent:: komutuyla türetilen sınıf içerisinde ki metodumuzu a sınıfı içerisinde de kullanabiliyoruz. Konuya açıklık getirmek gerekirse yukarıdaki kodumuzu $oop = New a diyerek a adlı sınıfımızı başlattık. Sınıfımız ekrana

“Merhaba” çıktısını verdi. Ancak biz a sınıfı içerisinde ekrana “Merhaba” yazan bir metot tanımlamadık.

@author Emrullah Tanıma Sayfa 11

Peki nasıl oldu ?

Aslında ekrana “merhaba” çıktısını veren metodumuz b sınıfımız içerisinde ki merhaba metodu. Biz a sınıfımızı b sınıfından türetmiştik. a sınıfımızın __construct metoduna da parent::merhaba yazdığımız için doğal olarak a sınıfımızı başlattığımız an b sınıfı içerisinde ki merhaba metodu da çalışıyor. Sınıf türetme olayına genişletme de denilmektedir.

Protected komutuyla oluşturulan metot ve argümanlara yalnızca sınıf içerisinden ve türetilen sınıf içerisinden erişilebilir dedik ve bir örnek vererek konuyu netleştirelim.

<?php

class b {

protected function merhaba {

echo "Merhaba";

}

}

$oop = New b ;

$oop->merhaba ;

>

Yukarıdaki kodumuzu çalıştırdığımız da fatal error verecektir. Çünkü protected olarak tanımladığımız bir metoda sınıf dışarısından erişmeye çalıştık. Şimdi bu kodumuzun çalışan halini yazalım.

<?php

class b {

protected function merhaba {

echo "Merhaba";

}

}

class a extends b {

public function __construct {

@author Emrullah Tanıma Sayfa 12

parent::merhaba ;

}

}

$oop = New a ;

>

Bu şekilde ekrana “Merhaba” çıktısını verecektir.

2.4. Static

Static komutuyla oluşturulan metot ve argümanlara sınıfı başlatmadan sınıf içerisinden yada sınıf dışından erişebiliriz. Static özelliği genellikle en çok kullanılan metotların daha hızlı çalışması ve bir sınıfın sadece bir metodunu, sınıfı çağırmadan kullanacaksak static komutunu kullanırız. Static komutunun diğerlerinden farkı public static şeklinde bir söz dizimi olmasıdır. Örneğin static $degisken veya static fonksiyon şeklinde yazarsak hata ile karşılaşırız. Static olarak tanımlanan bir metodu yada argümanı sınıf içerisinden kullanmak istediğimiz zaman ise self::$degisken yada parent::$degisken şeklinde kullanabiliriz.

Burada dikkat etmemiz gereken static olarak tanımlanmış olan değerlerin başına $ işaretini koymamız gerektiği.

Static olarak tanımlanan tüm metotlar ve argümanlar RAM’e atılır. Çağrıldığı zaman ise direk RAM’den çağrılarak diğer gizlilik komutlarına göre çok daha hızlı çalışır. Böylelikle performans kaybını önlemiş oluruz. Tabi ki bu her metodu static olarak tanımlamamızın doğru olduğu anlamına gelmez. Basit bir örnek vererek konumuzu netleştirelim.

<?php

class b {

public static $sabit = "Oop Dersleri";

public function yaz {

echo self::$sabit;

@author Emrullah Tanıma Sayfa 13

}

}

$oop = New b ;

$oop->yaz ;

>

Ekran çıktımız: “Oop Dersleri” olacaktır. Performanstan bahsetmişken yukarıda ki örneğimizi biraz daha farklılaştıralım. Kodlarımız:

<?php

class b {

public static $sabit = "Oop Dersleri";

public static function yaz {

echo self::$sabit;

}

}

b::yaz ;

>

Burada ne yaptığımıza bir bakalım. $sabit adında bir static değişken oluşturduk, yaz adında bir metot oluşturduk ve bu metodumuz içinden $sabit değerini ekrana yazdırdık. Ancak burada New komutu kullanmayıp sınıfı başlatmadığımız halde yine ekrana “Oop Dersleri” değerini yazdırdı.

PHP dilinde bir sınıfı çağırmadan da sınıf içerisinde static olarak tanımlanmış metot ve argümanlara erişebiliriz. Bunu yapabilmek

için sinifadi::arguman veya sinifadi::metot şeklinde kullanmamız gerekir. Bu şekilde bir kullanım bize sınıf içerisinde 100 tane metot olsa bile sadece bizim istediğimiz metodu yükler ve çalıştırır. __construct ve __destruct ana metotları dahi çalışmaz. Yani sınıfı komple yüklemez. Bu şekilde de performans artışı sağlayabiliriz.

@author Emrullah Tanıma Sayfa 14

Ayrıca içinde static bir değer bulunan bir sınıfı New diyerek başlattığımızda RAM’e her defasında yeni bir obje eklenir. Bu da hafıza da gereksiz bir yer kaplar. Sonuç olarak ne kadar New komutuyla tanımlarsak hafıza da o kadar fazla yer kaplamış oluruz.

2.5. Final

Final komutu türetilen sınıflarda en son kullanılacak sınıf, metot veya argümanlarda koruma amaçlı kullanılan bir komuttur. Özellikle bileşen (component) yapımında birden çok developer’ın kullanıldığı durumlarda olmazsa olmaz güvenlik mekanizmalarının başında gelir.

Final komutu sınıf tanımlamalarının başında kullanılır. Şöyle bir örnek verelim.

<?php

final class Bitis {

}

$oop = new Bitis ;

>

Yukarıdaki gibi final komutuyla tanımlanan bir sınıf başka bir sınıf tarafından türetilemez. Ancak bir başka sınıftan türeyebilir. Şu şekilde bir kullanım yanlıştır.

<?php

final class a {

}

class b extends a {

}

$oop = new b ;

>

@author Emrullah Tanıma Sayfa 15

Burada a sınıfımızı final olarak tanımladığımız için b sınıfımızı da a sınıfından türettiğimiz için hata alırız. Bu kodun doğru olan şekli ise şöyle olmalıdır.

<?php

class a {

}

final class b extends a {

}

$oop = new b ;

>

Oop mimarisinde gizlilik kavramları bundan ibarettir arkadaşlar. Bu konuda neler yaptığımızı, öğrendiğimiz yeni komutların ne işe yaradığının kısa bir özet geçelim. public : Her yerden erişilebilir.

private : Yalnızca sınıf içerisinden erişilebilir. protected : Sınıf içerisinden ve türetilen sınıflardan erişilebilir. static : Bir sınıfın yalnızca bir metodunu kullanacaksak static tanımlamalıyız. final : Başka bir sınıf tarafından türetilemez. Koruma amaçlı kullanılır. Sınıfların başında tanımlanır.

$this : Sınıf içerisinde ki herhangi bir metoda erişmek için kullanılır. parent:: : Türetilen sınıf içerisindeki metotlara erişmek için kullanılır. self:: : $this komutunun php5’deki halidir. $this yerine self kullanılması önerilir. sinifadi::metod : Bir sınıfı komple çağırmadan sadece istenen sabit metodun çağrılmasını sağlar.

sinifadi::arguman : Bir sınıfı komple çağırmadan sadece istenen sabit argümanın çağrılmasını sağlar.

@author Emrullah Tanıma Sayfa 16

self::$sabit : static olarak tanımlanan bir objenin çağrılmasını sağlar. Unutmamamız gereken static olarak tanımlanan değeri çağırırken önüne $ işareti koymamız gerektiği.

extends : Bir sınıfı başka bir sınıftan türetmek istediğimiz zaman kullanılır.

@author Emrullah Tanıma Sayfa 17

3. Sihirbaz Metotlar

Sihirbaz metot: sınıf ve olay çevresinde çalışan PHP dili ile tanımlı olarak gelen metotlardır.

Sihirbaz metotların sadece sınıf içerisinde kullanıldığı gibi yanlış bir bilgi oluşmasın kesinlikle. Sınıf dışında da bazı sihirbaz metotları kullanabilmek mümkündür. Bazı sihirbaz metotların diğer metotlara nazaran geliştiriciler tarafından çok fazla kullanıldığını söylemek doğru değil ancak bazı gerekli durumlarda kesinlikle kullanılması kanaatindeyim. PHP 5 ile gelen toplam 15 adet sihirbaz metot bulunmaktadır. PHP 7 de de bir değişiklik şu an söz konusu değil. Sihirbaz metotların önünde __ işlevi bulunur ve sihirbaz olmayan metotların önüne __ işlevi koyulması PHP tarafından önerilmez. İleride sorunlar çıkarabilir. Biz bu yazımızda 4 adet sihirbaz metodu inceleyeceğiz. Sihirbaz metotların hepsi public olarak tanımlanmak zorundadır.

3.1. __construct __construct metodu bir sınıf çağrıldığı anda çalışan metodumuzdur. Bu metodumuzu giriş bölümünde yapıcı metot olarak adlandırmıştık. Basit bir örnek ile olayı netleştirelim.

<?php

class OopDersleri {

public function __construct {

echo "OopDersleri sınıfı çalıştı.";

}

}

$oop = New OopDersleri ;

>

@author Emrullah Tanıma Sayfa 18

Bu betiği çalıştırdığımızda “OopDersleri sınıfı çalıştı” çıktısını verecektir. __construct sihirbaz metodu nerelerde kullanılır? ne işimize yarayacak? diye soracak olursanız bu metodumuz genelde türediği sınıfın metotlarına erişmek, sınıf kullanılmadan önce yapılması gereken temizleme vb. gibi işlemler için kullanılır. 3.2. __destruct __destruct metodu ise __construct metodunun aksine sınıf en son işlemi yaptığında yani sınıf bittiğinde çalışan metottur. Bu metodumuza da giriş bölümünde yıkıcı metot demiştik. Şimdi bir önceki sihirbaz metodumuz ve __destruct metodumuzu kullanarak bir örnek yapalım.

<?php

class OopDersleri {

public function __construct {

echo "OopDersleri sınıfı çalıştı.";

}

public function __destruct {

echo "OopDersleri sınıfı bitti.";

}

}

$oop = New OopDersleri ;

>

Bu betiği çalıştırdığımızda ise “OopDersleri sınıfı çalıştı.OopDersleri sınıfı bitti.” çıktısını verecektir.

@author Emrullah Tanıma Sayfa 19

3.3. __toString Bu sihirbaz metodumuz sınıf objesini direk ekrana bastığımızda, obje değeri yerine istediğimiz bir içeriğin veya argümanın çıkmasını sağlar. Bir objeyi direk ekrana basmak da nereden çıktı diyecek olursanız eğer hemen kısa bir örnekle önce onu açıklayalım.

<?php

class OopDersleri {

}

$oop = New OopDersleri ;

echo $oop;

>

Burada echo $oop koduyla objeyi direk ekrana bastık. Ancak bu kodumuz bize bir hata döndürdü. Şimdi basit bir örnekle _toString sihirbaz metodumuzun ne işe yaradığına bir bakalım.

<?php

class OopDersleri {

public $name = "OopDersleri Sınıfı";

public function __toString {

return $this->name;

}

}

$oop = New OopDersleri ;

echo $oop;

>

Bu betiğimiz bize “OopDersleri Sınıfı” çıktısını verecektir. Bu metodumuzu da aslında sınıfın adını ve sınıfın özelliklerini ekrana basmak için kullanıyoruz.

@author Emrullah Tanıma Sayfa 20

3.4. __call Bu sihirbaz metodumuz ise sınıf içerisinde olmayan bir metodu veya argümanı çağırdığımız zaman çalışan metodumuzdur. Genellikle hata metni oluşturmak için kullanılır. __call sihirbaz metodu diğerlerinden farklı olarak iki adet parametre alır.

<?php

class OopDersleri {

public function __call($name, $attr){

echo $name. " adlı metot bulunamadı.";

}

}

$oop = New OopDersleri ;

$oop->yaz ;

>

Bu betiğimiz bize çıktı olarak “yaz adlı metot bulunamadı.” çıktısını verecektir. Eğer burada __call sihirbaz metodunu kullanmamış olsaydık sınıf içerisinde olmayan bir metodu çağırdığımız için PHP derleyicimiz hata verecekti. Konunun başında bahsettiğim 15 adet sihirbaz metodu incelemek için http://php.net/manual/tr/language.oop5.magic.php adresini kullanabilirsiniz. 3.5. Örnek Sınıf

Bu konumuzda ise şimdiye kadar olan tüm konuların genel bir özetini kapsayacak örnek bir sınıf oluşturacağız ve nesne tabanlı programlama yapısını daha iyi anlayacağız.

Örnek sınıfımız oturum işlemlerini temel düzeyde yapacağımız bir session sınıfı olacak. Bu sınıfımızda oturum başlatma sonlandırma gibi işlemlerimizi yapacağız. Ne yapacağımız ile ilgili kafanızda bir şeyler canlandı sanırım. Dilerseniz hemen başlayalım. İlk olarak class komutuyla yeni bir sınıf oluşturalım. Ancak bu sınıfımızı final komutuyla tanımlayalım.

@author Emrullah Tanıma Sayfa 21

Gizlilik konumuzdan hatırlayacağınız üzere final komutunu koruma amaçlı ve başka bir sınıf tarafından türetilememesi için kullanıyorduk. Şimdi sınıfımızı oluşturalım.

<?php

final class Session {

}

>

Sınıfımızı oluşturduktan sonra oturumları başlatacak olan metodumuzu yazalım. Bu metodumuz çok fazla bir şey yapmayacak şimdilik bizim için session_start demesi yeterli. Bu metodumuza static olarak tanımlayalım. Gizlilik konusunda static komutunu sadece argümanlarda kullanmıştık şimdi de metotlarda kullanalım zaten yazım olarak pek bir farkı yok.

<?php

final class Session {

public static function init {

session_start ;

}

}

>

Bu metodumuzu static olarak tanımlamamızın bir diğer sebebi de sınıf dışından erişimi sağlamak. Şu an sınıfımız oturumu başlatan bir metoda sahip. Şimdi de oturumu sonlandıracak olan metodumuzu yazalım. Bu metodumuzu da static olarak tanımlıyoruz.

<?php

final class Session {

public static function init {

session_start ;

}

public static function logout {

session_destroy ;

}

}

@author Emrullah Tanıma Sayfa 22

>

Sihirbaz metotlar konumuzdan da bir şeyler yapalım ki bir faydası olsun. Şimdide sınıfımıza sınıfın adını ve özellikleri yazdıran __toString sihirbaz metodumuzu ekleyelim. Bunun için sınıfın adını taşıyan name adında bir private değişken, sınıfın özelliklerini taşıyan properties adında bir public değişken oluşturalım.

<?php

final class Session {

private $name = "Oop Dersleri Örnek Session Sınıfı"; public $properties = "Oturum başlatma,kapatma vs."; public static function init {

session_start ;

}

public static function logout {

session_destroy ;

}

public function __toString {

echo $this->name." - ".$this->properties;

}

}

>

Sınıf içerisinde ki bir metot veya değişkene ulaşmak için $this komutunu kullanıyorduk. Burada unutmamamız gereken şey ise bir metoda erişirken metot isminin yanına işaretlerini koymamız gerekiyordu. Artık sınıfımız oturum başlatıp sonlandırabiliyor. Şimdi ise oturumumuza değer ekleyecek olan set metodumuzu ve bize oturumdan değer döndürecek olan get metodumuzu yazalım.

Oop mimarisinde set ve get metotları çok kullanılır. Yukarıda da söylediğim gibi bir sınıf içerisinde ki bir argümana veya metoda değer eklemek set ve sınıf içerisinden her hangi bir değer almak için ise get kullanılır. Daha doğrusu global olarak bu işlemleri yapan metotlara get ve set adı verilir demek daha doğru olur. Bazı kaynaklarda getter ve setter metotları olarak da geçmektedir.

@author Emrullah Tanıma Sayfa 23

Şimdi ilk olarak set metodumuzu yazalım.

<?php

final class Session {

private $name = "Oop Dersleri Örnek Session Sınıfı"; public $properties = "Oturum başlatma,kapatma vs."; public static function init {

session_start ;

}

public static function logout {

session_destroy ;

}

public function __toString {

echo $this->name." - ".$this->properties;

}

// Set metodumuz

public static function set($key, $value){

$_SESSION[$key] = $value;

}

}

>

Burada farklı olarak set metodumuz iki adet parametre almaktadır. Burada ki parametreler fonksiyonlarda ki gibi çalışmaktadır. Mantık olarak aynıdır. $key parametremiz dizinin anahtarını $value ise değerini belirtir. Şimdi de get metodumuzu yazalım. Get metodumuz sadece bir parametre alacak ve bu parametre ile dizinin hangi elemanının verisini almak istediğimizi metodumuza söylemiş olacağız.

<?php

final class Session {

private $name = "Oop Dersleri Örnek Session Sınıfı"; public $properties = "Oturum başlatma,kapatma vs."; public static function init {

session_start ;

}

public static function logout {

@author Emrullah Tanıma Sayfa 24

session_destroy ;

}

public function __toString {

echo $this->name." - ".$this->properties;

}

// Set metodumuz

public static function set($key, $value){

$_SESSION[$key] = $value;

}

// Get metodumuz

public static function get($key){

if(isset($_SESSION[$key])){

return $_SESSION[$key];

}else{

return false;

}

}

}

>

Artık sınıfımız kullanıma hazır. Yukarıdaki kodlarımızı class.session.php olarak ana dizinimize kaydediyoruz. Şimdi index.php yada siz nasıl dilerseniz başka bir dosya oluşturalım ve içine yazmış olduğumuz sınıfımızı include edelim. İlk olarak sınıfımızı başlatmadan önceki konularımızda bahsettiğimiz gibi sınıf dışından init metoduyla oturumu başlatıp set metodumuzla içine bir şeyler ekleyelim. Daha sonra eklediğimiz değeri ekrana basalım ve logout metodumuzla oturumu kapatalım.

<?php

include('class.session.php');

Session::init ;

Session::set('login', true);

echo Session::get('login');

Session::logout ;

>

@author Emrullah Tanıma Sayfa 25

Bu betiği çalıştırdığımızda ekrana “1” çıktısını verecektir. Sınıf dışından bir metoda erişmek istediğimiz zaman Sinifadi::metot şeklinde erişiyorduk. Sınıfımızın yaptığı işlemi normal şartlarda bu şekilde yapıyoruz.

<?php

session_start ;

$_SESSION['login'] = true;

echo $_SESSION['login'];

session_destroy ;

>

Şeklinde de yine “1” çıktısını



Contact this candidate