<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yusuf Koç</title>
	<atom:link href="http://ysfkc.com/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://ysfkc.com</link>
	<description>Php günlüğü</description>
	<lastBuildDate>Fri, 23 Dec 2011 23:54:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Resim Upload Sınıfı</title>
		<link>http://ysfkc.com/php/resim-upload-sinifi</link>
		<comments>http://ysfkc.com/php/resim-upload-sinifi#comments</comments>
		<pubDate>Thu, 16 Jun 2011 15:09:27 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[image resize]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[resim]]></category>
		<category><![CDATA[upload]]></category>
		<category><![CDATA[watermak]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=63</guid>
		<description><![CDATA[Bir çoğumuz uygulamalarımızda dosya uplaodı illaki kullanmışızdır. Özellikle de resimlerle ilgili uploadlar olduğunda zaman zaman resize, watermark ve crop gibi işlemler için bir sürü site dolaşmışızdır ya da zamanla artık kendi sınıflarımızı yazıp hali hazır uygulamalarda onları kullanmışızdır. Ben de geçenlerde keşfettiğim bir sınıfı sizle paylaşmak istedim. Colin Verot ‘un yazmış olduğu dosya upload sınıfından [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/resim-upload-sinifi' addthis:title='Resim Upload Sınıfı ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Bir çoğumuz uygulamalarımızda dosya uplaodı illaki kullanmışızdır. Özellikle de resimlerle ilgili uploadlar olduğunda zaman zaman resize, watermark ve crop gibi işlemler için bir sürü site dolaşmışızdır ya da zamanla artık kendi sınıflarımızı yazıp hali hazır uygulamalarda onları kullanmışızdır. Ben de geçenlerde keşfettiğim bir sınıfı sizle paylaşmak istedim. Colin Verot ‘un yazmış olduğu <a href="http://www.verot.net/res/sources/class.upload.html">dosya upload</a> sınıfından bahsedeceğim.</p>
<p>Bu sınıf sadece resimlere yönelik bir upload sınıfı ve desteklediği formatlarda PNG,JPG,GIF ve BMP dir. Bunlar üzerinde türlü türlü işlemleri kolayca yapabilir ve uygulamalarınıza kolayca dahil edebilirsiniz.</p>
<p>Gelin şimdi bir örnekle açıklayalım.. Örneğimizde bir resmi kesip biçelim, watermark ve üstüne bir de yazı yazalım.</p>
<p>Öncelikle upload işlemi için formumuzu oluşturalım:</p>
<pre class="brush:xhtml">
<form enctype="multipart/form-data" method="post" action="upload.php">
<input type="file" size="32" name="image_field" value=""/>
<input type="submit" name="Submit" value="upload"/>
 </form>
</pre>
<p>Şimdi ise  upload işlemini yapacağımız dosyayı oluşturalım:</p>
<pre class="brush:php">
< ?php

# Upload Sınıfımızı Dahil Ediyoruz
include_once('class.upload.php');

# Sınıfımızı Başlatıyoruz.
$upload = new upload($_FILES['image_field']);

# Dosya Yüklenmiş mi ?
if ($upload->uploaded)
{
	$upload->file_auto_rename = true;
	$upload->image_resize = true;
	$upload->image_x = 500;
	$upload->image_ratio_y = true;
	$upload->image_text = 'ysfkc.com';
	$upload->image_text_color = '#ffffff';
	$upload->image_watermark = 'watermark.png';
	$upload->process('upload');

	if ($upload->processed)
	{
		echo 'Resim Yüklendi ve İstenilen İşlemler Uygulandı.';
		echo '<a href="upload/'.$upload->file_dst_name.'">'.$upload->file_dst_name.'</a>';

		$upload->clean();
	}
	else
	{
		echo 'Resim Yüklenemedi: '.$upload->error;
	}
}
?>
</pre>
<p>Upload dosyamızda neler yaptığımıza kısaca bir göz atalım isterseniz.</p>
<ul>
<li>İlk satırımızda upload için kullanacağımız upload sınıfımızı dahil ediyoruz.</li>
<li>Diğer satırımızda ise upload sınıfı başlatırken formdan gelen image kutucuğumuzun ismini belirtiyoruz. Yani sınıfta  __construct()  (yapılandırıc metot) uygulanmış ve bizden işlem yapacağı image kutucuğunun ismini vermemizi istiyor.</li>
<li>Daha sonra if koşulumuz ile dosyanın yüklenip yüklenmediğini kontrol ediyoruz. Eğer dosyamız başarıyla yüklendiyse $upload->uploaded değişkenimiz true ( doğru ) olarak dönmekte eğer yüklenmemişse false ( yanlış ) olarak dönmekte.</li>
<li>Sonraki satırımızda ise dosyamıza otomatik olarak bir isim verilmesini $uplolad->file_auto_rename özelliğini true yaparak sağlıyoruz.</li>
<li>Ardından resmimizi resize yapacağımız için $upload->image_resize özelliğimizi de true yaparak aktif ediyoruz.</li>
<li>Daha sonra resmimizin genişliğini 500 px olarak belirliyoruz $upload->image_x ile.<br />
$upload->image_ratio_y parametresini true yaparak yüksekliği kendisi otomatik olarak almasını sağlıyoruz. Böylelikle resmin bozulmasını da engellemiş oluyoruz.</li>
<li>Daha sonra yüklenen resmimize $upl0ad->image_text ile üzerine yazılmasını istediğimiz yazıyı belirtiyoruz.</li>
<li>$upload->image_text_color ile de üzerine yazılacak yazının rengini ayarlıyoruz.</li>
<li>$upload->image_watermark ile de resmimizin üzerine hangi resmi birleştirmek istiyorsak onu belirtiyoruz.</li>
<li>Daha sonra $upload->process() metodu ile de resmimizin hangi dizine yükleneceğini belirliyoruz.</li>
<li>Ardından yine bir if koşulu ile resmin istediğimiz dizine taşınıp taşınmadığını kontrol ediyoruz eğer resmimiz tüm işlemler yapılıp taşındıysa ekrana resim yüklendi diye yazdırıyoruz yok eğer problem oluştuysa else kısmında hata mesajını yazdıryoruz.</li>
</ul>
<p>Evet umarım birilerinin işine yarar  Örneğimizi buradan indirebilirsiniz. Ve upload sınıfı ile ilgili diğer tonla özellik için de buraya tıklayarak göz atabilirsiniz.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/resim-upload-sinifi' addthis:title='Resim Upload Sınıfı ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/resim-upload-sinifi/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Php Adapter Design Pattern</title>
		<link>http://ysfkc.com/php/php-adapter-design-pattern</link>
		<comments>http://ysfkc.com/php/php-adapter-design-pattern#comments</comments>
		<pubDate>Thu, 16 Jun 2011 15:03:44 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[adapter pattern]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[yazılım desenleri]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=61</guid>
		<description><![CDATA[Merhaba arkadaşlar çok uzun bir aradan (3 ay) sonra ancak fırsat bulabildim. Bloğa yazamamamın sebeplerinden bazıları işi bıraktım ve yeni firmam da işe başladım bu zaman zarfı sürecinde yeni işime alıştım üç ay kadar ceviz.net yöneticilerinden Sercan Virlan ile beraber çalışma imkanı buldum ve şuan da yeni iş yerimde mutlu ve huzurluyum. Konuya gelecek olursak [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-adapter-design-pattern' addthis:title='Php Adapter Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Merhaba arkadaşlar çok uzun bir aradan (3 ay) sonra ancak fırsat bulabildim. Bloğa yazamamamın sebeplerinden bazıları işi bıraktım ve yeni firmam da işe başladım bu zaman zarfı sürecinde yeni işime alıştım üç ay kadar ceviz.net yöneticilerinden Sercan Virlan ile beraber çalışma imkanı buldum ve şuan da yeni iş yerimde mutlu ve huzurluyum.</p>
<p>Konuya gelecek olursak bu yazıda daha önceki bahsettiğim singleton pattern ile paralel olan bir başka pattern, adapter pattern hakkında bilgi vermeye çalışacağım. Adapter pattern nerelerde kullanılır gerekli midir değil midir buna karar verecek olanlar sizlersiniz ama gerçek anlamda bir MVC yapısı kullancaksak artık bu oop mimarisi ve design patternlere önem vermeliyiz.</p>
<p>Adapter patterni şöyle izah edebiliriz bir düşüneyim ımmm  bir firmada çalışan bir a elemanı var bu a elemanı bir proje geliştirmiş ve işten bir süre sonra ayrılmış daha sonra ise işe siz başlamışsınız ve o projeye ek bişeyler yapmanız isteniyor ancak a elemanı kendine göre yazdığı için ufak bir kod değişikliği demek tüm projeyi baştan sona kontrol etmek anlamına geldiği için iş biraz sıkıcı ve yorucu olacaktır. Adapter pattern ile mevcut koda ( interface, abstract class ) extends ederek türetilen yeni bir interface veya abstract class yaparak mevcut projeyi bozmadan işimizi kolay halletme yoludur diyebiliriz. Örnek vermek istedim çünkü böyle daha kolay anlaşılır diye düşündüm.</p>
<p>Şimdi bizim a elemanı ne yapmış olsun bir tane interface tanımlasın ve bu interface sadece girilen ismi ekrana yazdırmak için kullanılan bir arayüz olsun aşağıdaki gibi</p>
<pre class="brush:php">
< ?php
interface isim
{
	public function getName($name);
}
?>
</pre>
<p>Bu arayüze (interface) uygun sınıfınıda yazmış olsun.</p>
<pre class="brush:php">
< ?php
class name implements isim
{
	public function getName($name)
	{
		echo $name;
	}
}
?>
</pre>
<p>Evet a elemanı tasarladığı arayüz üzerine sınıfınıda yazmış oldu. Ama hiç bir zaman kendisinin işi bırakacağını ve kendisinden sonra gelen birisinin buna ekleme yapması ihtimalini düşünmeyerek kodunu tamamladı. Derken işi bıraktı biz başladık işe ve bizim bu arayüze eklemeler yapmamız gerekti. Ancak arayüzü değiştirirsek bu sefer ona bağlı tüm classlarıda yeniden düzenlemek zorunda kalacağız. Çünkü arayüzle birleştirilmiş class birleştiriliği arayüz ile birebir aynı olmak zorundadır.</p>
<p>Yani biz tutupda arayüzü şu hale getiremeyiz.</p>
<pre class="brush:php">
< ?php
interface isim
{
	public function getName($name);
	public function getData();
}
?>
</pre>
<p>Bu şekile çevrilirse arayüz buna bağlı olan tüm classlar hata verecek ve işin içinden çıkılmaz bir hal alacaktır. Peki o zaman ne yapacağız mevcut yapıyı bozmadan nasıl kendi istediğimiz özellikleri bu isim arayüzüne ekleyeciz ? Classlar nasıl ki extends ile nasıl türetiliyor ise arayüzlerde bu şekilde türetilmektedir.</p>
<p>Derken biz bu arayüze bir metot daha tanımlamamız gerekti bu da ne olsun getSurname() metodu olsun yani girilen bir soyadını ekrana yazsın. Ama bunu yaparkende mevcut classları bozmasın.</p>
<p>Bunun içinde arayüzden arayüz türeteceğiz</p>
<pre class="brush:php">
< ?php
interface yeni_isim extends isim
{
	public function getSurname($surname);
}
?>
</pre>
<p>Hemen buna uygun sınıfımızı da yazalım</p>
<pre class="brush:php">
< ?php
class new_name implements yeni_isim
{
	public function getName($name)
	{
		echo $name;
	}

	public function getSurname($surname)
	{
		echo $surname;
	}
}
?>
</pre>
<p>Evet herşey bu kadar. Yeni sınıfımızı istediğimiz arayüze kolayca adapte etmiş olduk. Bir kaç açıklama daha yapmak gerekirse Name Classı sadece getName() metodunu çalıştırır getSurname() metoduna erişim yapamaz ancak New_Name Classı ise hem getName() hem de getSurname() metotlarına ulaşabilir çünkü yeni_isim arayüzünden türetildiği için getSurname() metodunu barındırmak zorunda kaldı yeni_isim de isim arayüzünden türetildiği için aynı zamanda getName() metodunu da barındırmak zorunda kaldı.</p>
<p>Örnek kullanımlarını da gösterelim daha anlaşılır olsun.</p>
<pre class="brush:php">
< ?php
$name = new name;
$name->getName('yusuf');
$name->getSurname('koç'); // Php Hata verecektir.

$new_name = new new_name;
$new_name->getName('yusuf');
$new_name->getSurname('koç');
?>
</pre>
<p>Görüldüğü üzere Adapter Pattern bu kadar.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-adapter-design-pattern' addthis:title='Php Adapter Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/php-adapter-design-pattern/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Php Decorate Design Pattern</title>
		<link>http://ysfkc.com/php/php-decorate-design-pattern</link>
		<comments>http://ysfkc.com/php/php-decorate-design-pattern#comments</comments>
		<pubDate>Thu, 16 Jun 2011 14:58:32 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[decorate pattern]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[yazılım desenleri]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=58</guid>
		<description><![CDATA[Decorate design pattern ile bir sınıfa başka bir sınıfı gömerek o sınıfa yeni bir sınıfın özelliklerini katmaya decorate pattern denir. Decorate design pattern için bir interface tanımlayalım. Bu interface sabit bir metot içereceği için basit şekilde vereceğiz tabi siz kendinize göre oluşturabilirsiniz. < ?php interface isimDecorate { public function __construct(isim $isim); } ?> yukarıdaki interface [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-decorate-design-pattern' addthis:title='Php Decorate Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Decorate design pattern ile bir sınıfa başka bir sınıfı gömerek o sınıfa yeni bir sınıfın özelliklerini katmaya decorate pattern denir.<br />
Decorate design pattern için bir interface tanımlayalım. Bu interface sabit bir metot içereceği için basit şekilde vereceğiz tabi siz kendinize göre oluşturabilirsiniz.</p>
<pre class="brush:php">
< ?php
interface isimDecorate
{
	public function __construct(isim $isim);
}
?>
</pre>
<p>yukarıdaki interface de bir yapılandırıcı metot tanımladık ve bu metota adı isim olan bir sınıfın geleceğini belirttik. Şimdi de interface için uygun bir sınıf yazalım.</p>
<pre class="brush:php">
< ?php
class isimDecorateClass implements isimDecorate
{
	public $isim;

	public function __construct(isim $isim)
	{
		$this->isim = $isim;
	}
}
?>
</pre>
<p>yukarıdaki isim sınıfımızı mevcut arayüzümüze göre yazdık. Yapılandırıcı metoduna isim adında bir sınıfın geleceğini ve bu gelen sınıfı da isimDecorate sınıfımızın içindeki publictanımlı $isim e aktaracağız.</p>
<p>Şimdide isim sınıfımızı tanımlayalım.</p>
<pre class="brush:php">
< ?php
class isim
{
	private $ad;
	private $soyad;

	public function adTanimla($ad)
	{
		$this->ad = $ad;
		return $this;
	}

	public function soyadTanimla($soyad)
	{
		$this->soyad = $soyad;
		return $this;
	}

	public function adVeSoyadGetir()
	{
		echo 'Adınız: '.$this->ad.' Soyadınız: '.$this->soyad;
	}
}
?>
</pre>
<p>Mevcut sınıflarımızı artık hazırladığımıza göre şimdi ise nasıl kullanacağız ona görelim.</p>
<pre class="brush:php">
< ?php
$isim = new isim;
$isim->adTanimla('yusuf');
$isim->soyadTanimla('koç');

$isimDecorate = new isimDecorateClass($isim);
$isimDecorate->isim->adVeSoyadGetir();
?>
</pre>
<p>Evet görüldüğü üzere önce isim sınıfımızı new ile başlatıp ad ve soyad tanımladıktan sonra oluşturduğumuz bu sınıfı isimDecorate içine gömdük ve isimDecorate sınıfına isim sınıfının özelliklerini katmış olduk.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-decorate-design-pattern' addthis:title='Php Decorate Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/php-decorate-design-pattern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Php Factory Design Pattern</title>
		<link>http://ysfkc.com/php/php-factory-design-pattern</link>
		<comments>http://ysfkc.com/php/php-factory-design-pattern#comments</comments>
		<pubDate>Thu, 16 Jun 2011 14:55:43 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[factory pattern]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[yazılım desenleri]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=56</guid>
		<description><![CDATA[Factory design pattern bize belirtilen sınıfları new operatörüyle başlatıp döndürür. Normal bir sınıf başlatmaktan pek bir farkı olmasada burdaki amaç bir nesne arayüzü yaratarak sınıflara erişimi bu arayüz üzerinden gerçekleştirmektir. Örnek olarak bir factory pattern sınıfı yazalım. Bu sınıf bize belirtilen nesne adına göre uygun bir dizinden ( class ) ilgili classı bulup başlatıp döndürdürsün. [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-factory-design-pattern' addthis:title='Php Factory Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Factory design pattern bize belirtilen sınıfları new operatörüyle başlatıp döndürür. Normal bir sınıf başlatmaktan pek bir farkı olmasada burdaki amaç bir nesne arayüzü yaratarak sınıflara erişimi bu arayüz üzerinden gerçekleştirmektir.</p>
<p>Örnek olarak bir factory pattern sınıfı yazalım. Bu sınıf bize belirtilen nesne adına göre uygun bir dizinden ( class ) ilgili classı bulup başlatıp döndürdürsün.</p>
<pre class="brush:php">
< ?php
class factory
{
	const class_dir = 'classes';
	public static function load($class)
	{
		try
		{
			if (file_exists(self::class_dir.'/'.$class.'.class.php'))
			{
				include_once(self::class_dir.'/'.$class.'.class.php');
				return new $class();
			}
			else
			{
				throw new Exception('Class Bulunamadı.');
			}
		}
		catch (Exception $e)
		{
			echo $e;
		}
	}
}
?>
</pre>
<p>Yukarıda tanımladığımız factory class bize belirtilen classın class_dir dizininde olup olmadığına bakarak eğer varsa bize başlatarak dönecektir eğer yok ise catch bloğu çalışarak class bulunamadı hatasını verecektir. Ayrıca yukarıdaki sınıfa göre sınıflar class_dir dizininde ve dosya adları da abc.class.php şeklinde olduğu varsayılmıştır.<br />
Şimdi gelelim iki tane sınıf yazalım. Birtanesi girilen ismi yazsın diğer ise sadece soyadını yazsın. Örnekleri basit tutuyorum ki anlaşılabilsin diye sonra demeyin isim ve soyisimden başka bişey bilmiyor musun be adam sen diye </p>
<pre class="brush:php">
< ?php
class name
{
	public function getName($name)
	{
		echo $name;
	}
}
?>
</pre>
<p>Şimdide soyisim sınıfımızı tanımlayalım</p>
<pre class="brush:php">
< ?php
class surname
{
	public function getSurname($surname)
	{
		echo $surname;
	}
}
?>
</pre>
<p>Bu classları class_dir dizinine name.class.php ve surname.class.php olarak kaydettiğinizi varsayıyorum ve factory sınıfımızın kullanımına geçiyorum</p>
<pre class="brush:php">
< ?php
include_once('class_dir/factory.class.php');
$isim = factory::load('name');
$isim->getName('yusuf ');

$surname = factory::load('surname');
$surname->getSurname('koç');
?>
</pre>
<p>Yukarıda öncelikle factory sınıfımızı sayfamıza dahil ediyoruz ve ardından artık bize hangi sınıf gerekiyorsa onu factory sınıfımıza bildiriyoruz. Eğer sınıf belirtilen dizin içinde mevcutsa bize sınıfı başlatıp döndürüyor değil ise hata veriyor.</p>
<p>Bunun bize faydası sınıfları daha tertipli ve düzenli bir şekilde başlatma olanağı sağlıyor ve tek bir arayüz üzerinden istediğimiz değişikliğe gitmemize olanak sağlıyor.<br />
Şöyle bir örnek verirsek sanırım daha iyi anlaşılacaktır. Farzedelim ki sınıflarınızı sayfalarınıza hep require veya include ile çağırdınız ve bir süre sonra sınıfları bir dizinde topladınız veya dizin adını değiştirdiniz. Ne yapmak lazım şimdi? Tüm sayfaları açıp require veya include satırlarını düzeltmek lazım. Ama eğer bunu factory pattern olarak düşünüp yazsaydık sadece factory classımızda değişiklik yaptığımızda tüm sitemizde uygulanmış olacaktı.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-factory-design-pattern' addthis:title='Php Factory Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/php-factory-design-pattern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Php Prototype Design Pattern</title>
		<link>http://ysfkc.com/php/prototype-design-pattern</link>
		<comments>http://ysfkc.com/php/prototype-design-pattern#comments</comments>
		<pubDate>Thu, 16 Jun 2011 14:52:29 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[prototype pattern]]></category>
		<category><![CDATA[yazılım desenleri]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=52</guid>
		<description><![CDATA[Bazen oluşturduğumuz sınıfları tekrar tekrar kullanmak isteyebiliriz. Örneğin Ali’nin not bilgilerini getiren bir notgetir sınıfını aynı sayfada bir de Veli için kullanmak istediğimiz zaman notgetir sınıfını bu seferde Veli için new operatörü ile başlatıp erişim sağlardık. Bu da yani tekrar new operatörü ile sınıfı başlatmak yine bellekte bir miktar yerin notgetir sınıfı için yeniden yer [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/prototype-design-pattern' addthis:title='Php Prototype Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Bazen oluşturduğumuz sınıfları tekrar tekrar kullanmak isteyebiliriz. Örneğin Ali’nin not bilgilerini getiren bir notgetir sınıfını aynı sayfada bir de Veli için kullanmak istediğimiz zaman notgetir sınıfını bu seferde Veli için new operatörü ile başlatıp erişim sağlardık.<br />
Bu da yani tekrar new operatörü ile sınıfı başlatmak yine bellekte bir miktar yerin notgetir sınıfı için yeniden yer ayrılmasına neden olacaktı. Prototype pattern ile daha önceden new ile başlatılan sınıfın bir kopyasını alarak aynı sınıfı tekrar new operatörüyle başlatmaktan kaçınmış ve performans artışı sağlamış oluyoruz.</p>
<p>Bir örnekle bahsedelim hemen.</p>
<pre class="brush:php">
< ?php
class notgetir
{
	private $isim;
	private $not;

	public function isim($isim)
	{
		$this->isim = $isim;
		return $this;
	}

	public function not($not)
	{
		$this->not = $not;
		return $this;
	}

	public function getir()
	{
		echo $this->isim.' \'nin Notu: '.$this->not;
	}

	public function __clone() {}
}
?>
</pre>
<p>Yukarıda ismi ve notu belirtilen kişinin ismini ve not değerini ekrana yazan bir sınıf tanımladık. Burda yabancı olunulan metot __clone() dur. Bu metot bu sınıfın kopyalanabilir olmasını sağlar. Aslında yazmasakda kopyalanabilir ama bazen bazı durumlarda tanımlanan sınıfın kopyalanması başımıza iş açabilir o yüzden sınıfların kopyalanma özelliğini kapatmak için bu __clone() metodunu ya private yaparız ya da içine exception ya da exit ile bir uyarı mesajı koyabiliriz.</p>
<p>Konuyu dağıtmadan devam edelim. Şimdi biz Ali için bu sınıfı çağıralım ve verilen bilgiler doğrultusunda bu bilgileri ekrana yazsın</p>
<pre class="brush:php">
< ?php
$not = new notgetir;
$not->isim('Ali')->not(90)->getir();
?>
</pre>
<p>yukarıda sınıfı new operatörü ile başlattık ve hangi öğrencinin notunu istiyorsak onun ismini ve notunu set edip getir metodu ile ekrana yazdırdık. Şimdide aynı işlemi Veli için yapalım.</p>
<pre class="brush:php">
< ?php
$not2 = new notgetir;
$not2->isim('Veli')->not(100)->getir();
?>
</pre>
<p>Şimdi yukarıda ne yaptık aynı sınıfı tekrar new operatörü ile başlattık ve ram de bir miktar daha yer kapladık ve bu da haliyle zamanla kaynak tüketimine yol açıp performansı düşürecektir.</p>
<p>Aynı örneği şimdide bir prototipini oluşturarak yapalım. Aslında burda yapacağımız tek işlem daha önce Ali için başlatılmış sınıfın bir kopyasını almak.</p>
<pre class="brush:php">
< ?php
$not2 = clone $not;
$not2->isim('Veli')->not(100)->getir();
?>
</pre>
<p>Burda clone opetörü ile daha önce başlatılan notgetir sınıfının bir prototipini aldık yani kopyaladık böylelikle tekrar sınıfı başlatmaktan kurtulmuş olduk.<br />
Bazılarınız $not2 = $not kısmı ile de yapılabilir bu diyebilir ama clone ile bu farklıdır. Aslında $not2 = $not demek $not2 nin $not a eşit olduğu anlamına gelir yani kopyasını almak değildir. Daha iyi anlayabilmek için aşağıdaki örneğe bakabilirsiniz.</p>
<pre class="brush:php">
< ?php
$not = new notgetir;
$not->isim('Ali')->not(90)->getir();

$not2 = $not;
$not2->getir();

$not3 = clone $not;
$not3->getir();
?>
</pre>
<p>Burda not2 $nota eşitleniyor ve getir metodu çağrıldığında ekrana Ali’nin notu 90 yazarken $not3 ile yine getir metodu çağrıldığında ekrana hiç bişey yazmayacaktır. Çünkü biz not3 değişkenine $not un kopyasını aldık.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/prototype-design-pattern' addthis:title='Php Prototype Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/prototype-design-pattern/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Php Singleton Design Pattern</title>
		<link>http://ysfkc.com/php/singleton-design-pattern</link>
		<comments>http://ysfkc.com/php/singleton-design-pattern#comments</comments>
		<pubDate>Thu, 16 Jun 2011 14:49:09 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[singleton pattern]]></category>
		<category><![CDATA[yazılım desenleri]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=49</guid>
		<description><![CDATA[Ben gibi bir çok kişi de geliştiriği uygulamalarda zaman zaman uygulamaların büyüklüğüne göre sınıflar yazıp kullanmışızdır. Nesne yönelimli bu yazılımda en azından benim canımı sıkan olay bazen sayfalarda tek tek yazmış olduğumuz sınıfları çağırmak zorunda kalırız. Bu durum da ister istemez uygulamanın performansına etki etmektedir zira nesne yönelimli uygulamalar yazmak hoş olsada dikkat edilmediği zaman [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/singleton-design-pattern' addthis:title='Php Singleton Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Ben gibi bir çok kişi de geliştiriği uygulamalarda zaman zaman uygulamaların büyüklüğüne göre sınıflar yazıp kullanmışızdır. Nesne yönelimli bu yazılımda en azından benim canımı sıkan olay bazen sayfalarda tek tek yazmış olduğumuz sınıfları çağırmak zorunda kalırız. Bu durum da ister istemez uygulamanın performansına etki etmektedir zira nesne yönelimli uygulamalar yazmak hoş olsada dikkat edilmediği zaman aşırı kaynak tüketimine yol açabilmektedir.</p>
<p>Bu yüzden bazı <a href="http://tr.wikipedia.org/wiki/Tasar%C4%B1m_%C3%B6r%C3%BCnt%C3%BCleri" target="_blank">yazılım desenleri</a> ortaya çıkmıştır. Benim bu yazıda size tanıtacağım yazılım deseni ise Singleton desenidir. Singleton deseni aslında bir sınıfın sadece bir kopya olmasını amaç edinmektedir. Yani bize lazım olacak bir veritabanı sınıfı uygulamada bir kez kullanmamız gerekmektedir. Çünkü veritabanı ile başka bir işlem yapmayacağızdır. Bu yüzden de birden çok veritabanı sınıf kopyası yerine daha önceden başlatılmış veritabanı sınıfını alıp kullanmaktır. Böylelikle kaynak tüketimini de boş yere harcamamış oluruz.</p>
<p>Singleton desenine geçmeden önce bu desen ile ilgili birşeyi atlamamamız gerekmektedir. Bu desende illaki static tanımlı erişim metodu olmak zorundadır. Static olma zorunluluğunun nedeni ise ramde tutulması içindir. Zaten bizde aynı sınıfa farklı bir yerde ihtiyaç duyduğumuzda daha önceden tanımlanmış ise ramden alacağız yoksada yeni başlatacağız.</p>
<p>Şimdi öncelikle bir bilgi sınıfı yazalım. Sınıf sadece girilen değerlere göre isim ve mesleği ekrana yazdırmak olacaktır.</p>
<pre class="brush:php">
< ?php
class bilgi
{
	private $isim;
	private $meslek;

	public function isimGir($isim)
	{
		$this->isim = $isim;
		return $this;
	}	

	public function meslekGir($meslek)
	{
		$this->meslek = $meslek;
		return $this;
	}

	public function bilgiGetir()
	{
		echo 'İsim: '.$this->isim.' Mesleği: '.$this->meslek;
	}
}
?>
</pre>
<p>Sınıfımızı yukarıdaki gibi tanımladık böylece artık kendisine verilen bir isim ve mesleği ekrana yazdıracaktır. Sınıfımız ile ilgili bir gelin bir örnek yapalım.</p>
<pre class="brush:php">
< ?php
include_once('bilgi.class.php');
$b = new bilgi;
$b->isimGir('Yusuf Koç')->meslekGir('PHP Developer')->bilgiGetir();
?>
</pre>
<p>evet ne yaptık bilgi sınıfını kullanabilmemiz için öncelikle sayfamıza dahil ettik ve $b = new bilgi; diyerek sınıfı başlattık. İlk etapda gayet normal gibi görünsede aynı sınıfı farklı sayfalarda da kullanmak istediğimizde yeniden çalışma sayfamıza dahil edip başlatmamız gerekecek ve kaynakta yeniden yer işgal etmiş olacağız.<br />
İşte singleton desenide burda devreye giriyor. Sadece bir tane başlatıp devamında bu sınıf çağrılmak istendiğinde mevcut başlatılmış sınıfı bize döndürüyor.</p>
<p>Singleton deseni için sınıfımızı yazalım.</p>
<pre class="brush:php">
< ?php
class Singleton
{
	private static $sinif = array();
	private static $sinifDizin = 'class';
	public static $sinifSay = 0;

	private function __construct() { }

	public static function sinifOrnegiAl($sinif)
	{
		if (!(self::$sinif[$sinif] instanceof $sinif))
		{
			include_once(self::$sinifDizin.'/'.$sinif.'.class.php');
			self::$sinif[$sinif] = new $sinif;
			self::$sinifSay++;
		}
		return self::$sinif[$sinif];
	}
}
?>
</pre>
<p>Singleton sınıfımızı kısaca açıklamak istiyorum. Öncelikle sınıf içinde kullanmak üzere bazı değişkenler tanımladık. Ayrıca sınıfımızın yapılandırıcı fonksiyonunu da private olarak tanımlayarak $s = new Singleton; gibi kullanımların önüne geçmiş olduk.</p>
<p>sinifOrnegiAl() metodu ile kullanmak istediğimiz sınıf adını belirtiyoruz. Burda dikkat etmemiz gereken şey ben sınıf adını vererek class/sinifadi.class.php şeklinde bir dizinde tutup ordan include ettiriyorum siz kendinize göre düzenleyebilirsiniz devam edelim if bloğunda sınıf içinde static tanımlanmış sinif nesnesinin bize bildirilen sınıfın bir örneği olup olmadığına bakıyoruz eğer bir örneği değil ise istenilen sınıfı include edip başlatıyoruz ve return ile döndürüyoruz. Ayrıca burdaki $sinifSay her kullanımda bir artırarak kullanılan toplam sınıf sayısını elde ediyoruz.</p>
<p>Gelelim şimdi kullanımına. Öncelikle ana sınıfımızı kullanmak istediğimiz sayfalarımıza dahil ediyoruz ve Ardından aşağıdaki gibi başlatıyoruz.</p>
<pre class="brush:php">
include_once('class/singleton.class.php');
$bilgi = new Singleton; // Ölümcül Hata Alırsınız. Çünkü Direk Erişimi private function __construct() ile yasakladık.
$bilgi = Singleton::sinifOrnegiAl('bilgi'); // Doğru olan bu.
$bilgi->isimGir('Yusuf Koç')->meslekGir('PHP Developer')->bilgiGetir();
</pre>
<p>yukarıda iki satır yazdım ve açıklamalarınıda yanına yazdım. Evet böylelikle bilgi sınıfımız tanımlandı ve bir daha tekrar kullanılmak için singleton sınıfı ile çağrıldığında artık daha önce başlatıldıysa direk return etcek başlatılmadıysa başlatıp öyle return etcek.<br />
Diyeceklerim bu kadar anlatım bozuklukları olabilir gördüğünüz yerleri bana Hakkımda kısmından mail atarak bildirirseniz gerekli düzenlemeleri yaparım.<br />
Şimdilik Hoşçakalın…</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/singleton-design-pattern' addthis:title='Php Singleton Design Pattern ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/singleton-design-pattern/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Php __autoload fonksiyonu</title>
		<link>http://ysfkc.com/php/php-__autoload-fonksiyonu</link>
		<comments>http://ysfkc.com/php/php-__autoload-fonksiyonu#comments</comments>
		<pubDate>Thu, 16 Jun 2011 14:46:26 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[__autoload]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=47</guid>
		<description><![CDATA[Php ile classlara değinmeden önce OOP nedir diye bir açıklama gereği hissetmiyorum . Direk konuya dalmak istiyorum zira herkes bi yerde mutlaka OOP nedir diye okumuşlardır. Okumayanlar içinde buyrun link burada. Sınıflara ilk __autoload fonksiyondan başlayalım. Bu metot sınıflarımızı uygulamamıza otomatik olarak yükleyecektir böylece şu classı yüklemişmiydim yüklememişmiydim derdinden kurtuluyoruz. Metotu bir örnekle açıklayıp bitirelim. [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-__autoload-fonksiyonu' addthis:title='Php __autoload fonksiyonu ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Php ile classlara değinmeden önce OOP nedir diye bir açıklama gereği hissetmiyorum  . Direk konuya dalmak istiyorum zira herkes bi yerde mutlaka OOP nedir diye okumuşlardır. Okumayanlar içinde buyrun link burada.</p>
<p>Sınıflara ilk __autoload fonksiyondan başlayalım. Bu metot sınıflarımızı uygulamamıza otomatik olarak yükleyecektir böylece şu classı yüklemişmiydim yüklememişmiydim derdinden kurtuluyoruz.<br />
Metotu bir örnekle açıklayıp bitirelim. Öncelikle bir dizin  ve içinde index.php ve bir de class adında dizin oluşturalım ve class dizini içerisine de a.class.php ve b.class.php diye iki adet php dosyası oluşturalım.</p>
<p>Burdaki önemli nokta class dosyalarımıza gelişi güzel bir isim değilde bir düzen içerisinde isim vermektir. Çünkü fonksiyon belli bir düzeneğe göre eklemee yapacaktır. örneğin a.class.php dosyasını yüklerken class.b.php dosyasını yüklemeyecektir az sonra yazacağımız fonksiyon da bu düzeni siz kendinize göre oluşturabilirsiniz.<br />
Evet dosyalarımızı oluşturduğumuza göre autoload fonksiyonumuzu yazalım.</p>
<p>autoload.php:</p>
<pre class="brush:php">
< ?php
function __autoload($classname)
{
    $include = "class/{$classname}.class.php";
    if (file_exists($include))
    {
        include_once($include);
    }
    else
    {
        exit($classname.' sınıfı yüklenemedi.');
    }
}
?>
</pre>
<p>Yukarıdaki autoload fonksiyonunu sayfamızın üstüne include ediyoruz. Daha sonra ise class dizinindeki herhangi bir sınıfı başlatmak istediğimiz de autoload devreye girerek sınıfı yüklüyor. Eğer hiç bir sınıf başlatmassanız sayfada hiç bir sınıfı dahil etmemiş olursunuz.</p>
<p>class/a.class.php:</p>
<pre class="brush:php">
< ?php
class a
{
    public function __construct()
    {
        echo 'Merhaba ben a sınıfıyım';
    }
}
?>
</pre>
<p>class/b.class.php:</p>
<pre class="brush:php">
< ?php
class b
{
    public function __construct()
    {
        echo 'Merhaba ben b sınıfıyım';
    }
}
?>
</pre>
<p>Yukarıda autoload fonksiyonu ile yüklenmesini istediğimiz sınıfları yazdık ve class dizinine sınıfadi.class.php şeklinde kaydettik.<br />
Şimdide en son olarak index.php mizi yazalım ve örneğimizin çalışır halini görelim.</p>
<p>index.php:</p>
<pre class="brush:php">
< ?php
# Sayfa tipini ve karakter setini belirtelim.
header('Content-Type: text/html; charset=utf-8');

# Autoload fonksiyonumuzu dahil edelim.
include_once('autoload.php');

$a = new a;
echo '';
$b = new b;
?>
</pre>
<p>Görüldüğü üzere __autoload fonksiyonu biz tek tek belirtmemize gerek kalmadan tüm sınıfları sayfamıza dahil etti. Burdan şu anlaşılmasın içinde 100 tane dosya varsa hepsini dahil etmiyor sayfanızda hangi sınıfı başlatıyorsanız o sınıfı dahil ediyor sadece.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-__autoload-fonksiyonu' addthis:title='Php __autoload fonksiyonu ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/php-__autoload-fonksiyonu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Php ile class özellikleri</title>
		<link>http://ysfkc.com/php/php-ile-class-ozellikleri</link>
		<comments>http://ysfkc.com/php/php-ile-class-ozellikleri#comments</comments>
		<pubDate>Thu, 16 Jun 2011 14:40:41 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[const]]></category>
		<category><![CDATA[final]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[private]]></category>
		<category><![CDATA[protected]]></category>
		<category><![CDATA[public]]></category>
		<category><![CDATA[static]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=45</guid>
		<description><![CDATA[Bir önceki yazımızda sınıflarımızda kullanabileceğimiz public, protected, private, static, const ve final gibi özelliklerin geldiğine değinmiştik. Bu özellikler sınıf içerisindeki bir değişken veya metodun kullanıcı tarafından kullanılıp kullanılmayacağına karar vermek veya türetilen bir sınıfın bunu kullanıp kullanamacağını karar vermek için kullanıyoruz. Yani kısaca özetlemek gerekirse bir kısıtlama söz konusu yapabilmekteyiz. Bu özellik php4 ile yapılamamktaydı [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-ile-class-ozellikleri' addthis:title='Php ile class özellikleri ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Bir önceki yazımızda sınıflarımızda kullanabileceğimiz public, protected, private, static, const ve final gibi özelliklerin geldiğine değinmiştik. Bu özellikler sınıf içerisindeki bir değişken veya metodun kullanıcı tarafından kullanılıp kullanılmayacağına karar vermek veya türetilen bir sınıfın bunu kullanıp kullanamacağını karar vermek için kullanıyoruz. Yani kısaca özetlemek gerekirse bir kısıtlama söz konusu yapabilmekteyiz. Bu özellik php4 ile yapılamamktaydı bu da yazılımcılara büyük bir sıkıntı idi.</p>
<p>Zira hangi metot veya değişkenlerin public veya private olduğunu belirtmek zorunda kalırdık. Php5 ile artık bu özelliklere hakimiz.</p>
<p><strong>Public Özelliği</strong><br />
Öncelikle public özelliğine değinelim. Public özelliği atanan bir değişken veya metot kullanıcı tarafından erişilebilir olmaktadır. Aynı zamanda sınıf içerisinden veya türeyen bir sınıf içersinden de erişebilir.</p>
<p>Hemen bir örnekle daha da pekiştirelim.</p>
<pre class="brush:php">
< ?php
class a
{
    public $isim = 'yusuf';

    public function isimGetir()
    {
        echo $this->isim;
    }
}

$a = new a;
echo $a->isim;
echo '';
$a->isimGetir();
?>
</pre>
<p>Yukarıdaki örnekte hem bir değişkene public özelliğini hem de bir metoda public özelliğini atadık. Public ve diğer özellikler değişken veya metotdan önce başına yazılır örnektede görüldüğü gibi.</p>
<p>$a ve isimGetir() e public özelliği atandığı için sınıf başlatarak a classındaki bu değerlere erişme hakkına sahip olduk.</p>
<p><strong>Protected Özelliği</strong><br />
Protected özelliği atanan bir değişken veya metot ise sadece sınıf içerisinden veya türetilen bir sınıf içerisinden erişim hakkına izin verir. Yani kullanıcı başlattığı sınıf içindeki protected tanımlı değişken veya metotlara asla erişemez.</p>
<p>Örnekle devam edelim.</p>
<pre class="brush:php">
< ?php
class a
{
    protected $isim = 'yusuf';

    public function isimGetir()
    {
        echo $this->isim;
    }
}

$a = new a;
echo $a->isim;
echo '';
$a->isimGetir();
?>
</pre>
<p>Yukarıdaki örneği çalıştırdığımızda ekrana “Cannot access protected property..” diye hata çıktısı verecektir. Bunun sebebi classı başlatıp ardından da protected özelliği atanmiş değişkeni çağırmak istememizden dolayıdır. Ancak echo $a->isim; satırını silersek ekrana bu sefer $isim içeriğini yazacaktır.<br />
Neden hata vermiyor gibi bir düşünce gelebilir aklınıza ama ne demiştik protected veya private tanımlı bir değişken veya metot sadece sınıfın kendi içinden çağrılabilir dolayısıyla public tanımlanmış isimGetir() metodu sınıfın içinde olduğu için $isim değişkenine bu metot sayesinde erişmiş oluyoruz. Böylece classı kullanacakların classı olumsuz etkilemesinden korumuş oluyoruz.</p>
<p><strong>Private Özelliği</strong><br />
Private özelliği de işleyiş olarak protected a benzese de aslında protected tek farkı türetilen bir classdan erişim hakkı yapamaz. Bu da demek oluyor ki private özelliği atanan değişken veya metot sadece o sınıf için özel olmuş oluyor. Hiç bir şekilde classı kullanmak isteyen ziyaretçi veya türeyen bir sınıf bu değişken veya metota erişim yapamaz.</p>
<p>Örnekle devam edelim</p>
<pre class="brush:php">
< ?php
class a
{
    private $isim = 'yusuf';

    public function isimGetir()
    {
        echo $this->isim;
    }
}

$a = new a;
echo $a->isim;
echo '';
$a->isimGetir();
?>
</pre>
<p>Yukarıdaki örnekte bu sefer $isim değişkenine private özelliğini atadık. Sınıf başlatılıp ardından $isim değişkenini çağırdığımızda ekranda “Cannot access private property..” gibi bir hata ile karşılaşarız. Çünkü $isim değişkeni sadece o sınıf için özel bir değişken. Hiç bir şekilde dışarıdan ( kullanıcı tarafından ) veya türetilen sınıftan erişim sağlanamaz.</p>
<p>Böylelikle türetilen classların da buna etki edebilerek mevcut classın işleyişinin bozulması önlenmiş olur.</p>
<p><strong>Static özelliği</strong><br />
Static özelliği atanmış bir değişken veya metot ramde saklanır. Böylece sürekli sürekli çağrılarak ramden çalmak yerine bir defaya mahsus rame atılarak performans kaybı önlenmiş olur. Static özelliğini herşeye atamakta doğru değildir. Zira projede kullanılacak sabit değişken veya metota atamak doğrudur. Çünkü bunlar hep aynı sonucu döndürecekleri için bir defaya rame aktarılması bize performans açısından büyük hız getirecektir.</p>
<p>Ayrıca static özelliği atanmış bir değişken veya metoda sınıf içerisinde $this yerine self:: ile erişim sağlanmaktadır.</p>
<p>Örnekle devam edelim.</p>
<pre class="brush:php">
< ?php
class a
{
    private static $isim = 'yusuf';

    public static function isimGetir()
    {
        echo self::$isim;
    }
}

a::isimGetir();
?>
</pre>
<p>Bu örnekte de isimGetir metoduna hem public ( dışarıdan erişim yapma özelliği ) hem de static özelliği atanmıştır. Burda tek fark olarak normalde sınıfı başlatmamız gerekirdi ancak isimGetir metodu static olduğu için direk olarak erişim yapabiliriz. Buna değişkenlerde dahil.</p>
<p>Dışarıdan erişim yaparken sınıfadi::metot veya değişken şeklinde erişim yapabiliriz. a::isimGetir() diyerek a classının isimGetir() metoduna direk erişim yaptık ve static metodumuzu çağırdık böylece artık rame atıldı veya bundan sonraki her çağrılmasında artık bize ramden dönerek performans artışı sağlamış olacaktır.</p>
<p><strong>Const Özelliği</strong><br />
Const özelliği atanan bir değer class içinde sabit özelliğini alır. Bu bizim normal kodlarımızdaki define() metodu ile aynıdır fakat sadece class içinde geçerlidir. Const özelliği atanmış bir sabite $this ile değil yine self:: ile erişim yapmaktayız dolayısıyla static özelliğini alırlar çünkü sınıf boyunca sakladıkları değer aynı kalacağından bir defaya mahsus ram de tutulurlar.</p>
<p>Ayrıca const özelliği atanan sabitin başında $ işareti bulanamaz. const sabit = ‘deger’; şeklinde tanımlanırlar.</p>
<p>Örnekle devam edelim.</p>
<pre class="brush:php">
< ?php
class a
{
    const isim = 'yusuf';

    public function isimGetir()
    {
        echo self::isim;
    }
}

$a = new a;
echo a::isim;
echo '';
$a->isimGetir();
?>
</pre>
<p>Bu örnekte de görüldüğü gibi isim sabiti static özelliği de olduğu için hem a::isim; şeklinde ulaşabildik hem de sınıf içinde bir metot sayesinde ulaşabildik.</p>
<p><strong>Final Özelliği</strong><br />
Final özelliği atanmış bir metot veya sınıf son metot veya son sınıf olduğunu işaret eder yani kendisinden sonra herhangi bir başka metot veya sınıf gelemez anlamını taşımaktadır.</p>
<p>Örnekle devam edelim</p>
<pre class="brush:php">
< ?php
class a
{
    private $isim = 'yusuf';
    public final function isimGetir()
    {
        echo $this->isim;
    }
}

class b extends a
{
    private $baska_isim = 'veli';

    public function isimGetir()
    {
        echo $this->baska_isim;
    }
}

$b = new b;
$b->isimGetir();
?>
</pre>
<p>Bu örnekte a classının en son metodunun isimGetir() olduğu tanımlanmıştır ve bu metotdan sonra herhangi bir metot gelemeyecektir. Yani a sınıfından türeyen bir class da hiç bir şekilde isimGetir() metodu bulunamaz çünkü isimGetir() a sınıfının final metodur ve override (yok sayılarak yeniden aynı metot yazılamaz. (tamam tercümem biraz düşük oldu  ) edilemez.</p>
<p>Bu örnek bize metot içindi birde sınıflar bir birleri arasında türetilirken artık son sınıf olduğunu belirtmemiz gerekebilir. Bunun için de class sözcüğünün başına final anahtarı getirilir.</p>
<pre class="brush:php">
< ?php
class a
{
    public function aGetir()
    {
        echo 'Ben A sınıfıyım. ';
    }
}

class b extends a
{
    public function bGetir()
    {
        echo 'Ben B sınıfıyım. ';
    }
}

final class c extends b
{
    public function cGetir()
    {
        echo 'Ben C sınıfıyım ve benden sonra başka bir sınıf bana extends edilemez. ';
    }
}

$c = new c;
$c->aGetir();
$c->bGetir();
$c->cGetir();

class d extends c
{
    public function dGetir()
    {
        echo 'Ben D sınıfıyım.';
    }
}

$d = new d;
?>
</pre>
<p>Bu örnek çalıştırıldığında c classı final anahtar sözcüğü atandığı için kendisinden hiç bir şekilde sınıf türetilemeyecek ve ekrana “Class d my not inherit from final class (c)..” gibi şeklinde hata mesajı döndürecektir.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-ile-class-ozellikleri' addthis:title='Php ile class özellikleri ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/php-ile-class-ozellikleri/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Php ile classlara giriş. __construct ve __destruct metotları</title>
		<link>http://ysfkc.com/php/php-ile-classlara-giris-__construct-ve-__destruct-metotlari</link>
		<comments>http://ysfkc.com/php/php-ile-classlara-giris-__construct-ve-__destruct-metotlari#comments</comments>
		<pubDate>Thu, 16 Jun 2011 14:14:13 +0000</pubDate>
		<dc:creator>Ysfkc</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[__construct()]]></category>
		<category><![CDATA[__destruct()]]></category>

		<guid isPermaLink="false">http://ysfkc.com/?p=24</guid>
		<description><![CDATA[Php ile classlara girmeden önce class yapısı hakkında biraz bilgi vermek istiyorum. Php5 ile class yapılarında ciddi bir değişiklik söz konusu oldu php4 deki class yapısı bize bir çok şeyi yapmamıza imkan vermiyordu. Örneğin bir signleton yazılım desenine olanak sağlamıyordu veya gizli olması gereken fonksiyon veya değişkenleri gizlemek için genelde diğerlerinden ayrı olsun diye comment [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-ile-classlara-giris-__construct-ve-__destruct-metotlari' addthis:title='Php ile classlara giriş. __construct ve __destruct metotları ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<p>Php ile classlara girmeden önce class yapısı hakkında biraz bilgi vermek istiyorum. Php5 ile class yapılarında ciddi bir değişiklik söz konusu oldu php4 deki class yapısı bize bir çok şeyi yapmamıza imkan vermiyordu. Örneğin bir signleton yazılım desenine olanak sağlamıyordu veya gizli olması gereken fonksiyon veya değişkenleri gizlemek için genelde diğerlerinden ayrı olsun diye comment satırları girer veya önlerine _ koyarak belirtmeye çalışır kullanıcıların yanlış kullanımlarını önlemeye çalışırdık.</p>
<p>Php5 den itibaren artık bu tarz comment satırları girmek yerine public, protected, private, static, final, const gibi tanımlar gelmiştir. Bunlar class yazılımında programcılara büyük bir avantaj sağlamaktadır. Örneğin kullanıcının kullanmasını istemediğimiz metot veya değişkenleri private tanımlayarak sadece class içerisinden erişim yapmasını sağlayabiliyoruz ve daha bunun gibi bir çok yeni güzel şeyler var.</p>
<p>Şimdi gelelim classlara. Php ile class yazarken genelde kullanacağımız iki adet sabit metot var diyelim. Sabit dedim başka bir isim bulamadım şuan aklıma gelmiyor. Bu metotlar olmassa olmaz değil ama zamanla çok işimize yarayacak olan __construct ve __destruct metotlarıdır. Construct bir class başlatılırken yapılacak olan işleri yapmakla yükümlü olurken destruct metodu ise tam tersi sınıf sonlandığında yapılması gereken işleri yapmakla yükümlüdür.<br />
Nerelerde kullanacağız sorusuna gelince, Bir sınıf başlatılırken belli başlı bazı ayarlar veya ek işlemler varsa bu metot içine yazılır. Destruct da ise tam tersi örneğin bir class başlarken kullanılan ayarları sıfırlamak için kullanabilirsiniz veya değişkenleri unset etmek için kullanabilirsiniz.</p>
<p>Örnekle devam edelim.</p>
<pre class="brush:php">
< ?php
class ilk_sinifim
{
    public function __construct()
    {
        echo 'Merhaba \'ilk_sinifim\' başlatıldı.';
    }
}

$ilk_sinifim = new ilk_sinifim;
?>
</pre>
<p>Yukarıdaki örneğimizi yazıp çalıştırdığımız da ekrana “Merhaba ‘ilk_sinifim’ başlatıldı.” şeklinde bir yazıyla karşılaşırız. Ne demiştik __construct (kurucu fonksiyon, yapılandırıcı fonksiyon) sınıf başlatılırken yapılması gereken işlemler varsa bu metotda tanımlanır ve sınıf başlatılırken bu metot içeriği otomatik çalışır demiştik.<br />
Aynı zamanda eğer __construct metodunu kullanacaksak kesinlikle public anahtarı ile tanımlanması gerekir aksi halde protected veya private tanımlanırsa hata ile karşılaşırsınız. İsterseniz __construct metoduna sınıf başlatılırken değişken de gönderebilirsiniz.</p>
<p>Aynı örneği bu sefer de değişken göndererek yapalım.</p>
<pre class="brush:php">
< ?php
class ilk_sinifim
{
    public function __construct($name)
    {
        echo 'Merhaba {$name}, ben \'ilk_sinifim\' memnun oldum.';
    }
}

$ilk_sinifim = new ilk_sinifim('yusuf');
?>
</pre>
<p>Bu örnekte de sınıf başlatılırken bir $name değişkeni gönderdik. Sınıf başlatıldığında ise “Merhaba yusuf ben ‘ilk_sinifim’ memnun oldum.” yazısı çıkacaktır.<br />
Destruct metodu ise construct metodunun tam tersidir. Sınıf sona erdiğindeki işlemleri yapar.<br />
Bir örnekle pekiştirelim.</p>
<pre class="brush:php">
< ?php
class ilk_sinifim
{
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
        echo $this->name;
    }

    public function __destruct()
    {
        echo 'Name değişken içeriği boşaltıldı.';
        unset($this->name);
    }
}

$ilk_sinifim = new ilk_sinifim('yusuf');
?>
</pre>
<p>Örnekte öncelikle dışardan erişemeyecekleri şekilde bir $name değişkeni tanımladık. Ardından __construct metoduna bir $name değişkeni göndererek sınıf içinde tanımladığımız $name değişkenine eşitledik ve ekrana yazdırdık. Ardından sınıf sonlanacağı vakit ekrana “Name değişken içeriği boşaltıldı.” yazısını yazıp sınıf içindeki $name değişkeninin içeriğini boşaltacaktır.</p>
<p>Destruct metoduda construct gibi public ile tanımlanmalıdır.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://ysfkc.com/php/php-ile-classlara-giris-__construct-ve-__destruct-metotlari' addthis:title='Php ile classlara giriş. __construct ve __destruct metotları ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://ysfkc.com/php/php-ile-classlara-giris-__construct-ve-__destruct-metotlari/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

