RSS
 

Archive for the ‘PHP’ Category

PHP Cephesindeki Son Gelişmeler

29 Jul

Merhaba,

Bildiğiniz gibi bir süredir PHP 6′nın gelmesini dört gözle bekliyorum fakat iptal edildiğine dair bilgiler aldım. Yerine PHP 5.4 sürümünü yayınlayacaklarmış ve APC gibi özellikler 5.4 ile yine sunulacakmış. Eğer 6′da ekleyeceklerini söyledikleri özelliklerin %40′nı 5.4′te sunarlarsa bence sorun yok. :) Zaten APC’nin core’un içine gömülmesi bence en güzel özelliklerden biri :)

Bu arada PHP 5.3.3 versiyonu release edildi. OOP tarafındaki geriye dönük desteklemede bir değişiklik yapmışlar. Namespace kullanıyorsanız, eskiden object’in aynı isminde bir method create ettiğimizde class bunu kendi construction metodu gibi görüyordu fakat artık normal sıradan bir method gibi ele alarak interpreter’a sunacakmış. Eğer namespace kullanmıyorsanız yine __construct() metodu olarak call edecektir ki kullandığınızı umuyorum. :) 100′den fazla bug’u fixlemişler. XML-RPC’deki Null Pointer problemide fixlenmiş. Tüm listeyi incelemek isterseniz buraya tıklayabilirsiniz.

Türkiye’ye döndüğümde ilk fırsat bulduğum anda uzun bir makale yazmayı planlıyorum. :)

Saygılarımla.

 
No Comments

Posted in PHP

 

Singleton Pattern

08 Apr

Merhaba Arkadaşlar,

Bu makalemde Creational desenlerden olan Singleton Pattern’ı inceleyeceğiz. Design Pattern’lar arasında en kolayı diyebiliriz.

Kısaca Tasarım Desenleri; Dünyanın farklı yerlerinde programcılar tarafından belirli bir soruna çözüm getirmek amacı ile oluşturulmuş yazılım kalıplarıdır. Dil bağımsızdır. Her hangi bir dilde yazılmış Design Pattern örneğini siz kendi kullandığınız dildede uygulayabilirsiniz.

Singleton Pattern ise object’mizin runtime da tekil olmasını sağlamaktadır. Bu da object’nin bir kere oluşturulup, istediğimiz kadar kullanmamızı sağlıyor. Böylece hem hız kazanıyoruz hem de memory alanından tasarruf etmiş oluyoruz. Data Access Layer’da uygulanabilir bir pattern’dır. Hemen bir örnek ile açıklayalım.

<?php
namespace Patterns{
	final class SingletonPattern{

		private static $object;

		private function __construct(){

		}
		public static function getObject(){
			if(!isset(self::$object)){
				$cls = __CLASS__;
				self::$object = new $cls;
				print("Oluşturdum!<br/>");
			}
			print("Zaten Vardım!<br/>");
			return self::$object;
		}
	}
}

namespace {

	$class  =& \Patterns\SingletonPattern::getObject();
	$class1 =& \Patterns\SingletonPattern::getObject();
	$class2 =& \Patterns\SingletonPattern::getObject();
	$class3 =& \Patterns\SingletonPattern::getObject();
	$class4 =& \Patterns\SingletonPattern::getObject();

	//$class = new \Patterns\SingletonPattern();
}
?>

Ben bir metoda bağlayarak çağırdım siz public static bir instance yaratıp bunun üzerindende nesneyi temsil edebilirsiniz. Nesnemiz new ile yaratılmasını önlemek içinde nesnenin construction(yapıcı metod)’nı private olarak değiştirdik. Böylece eğer yorum satırına aldığım kodu çalıştırmayı denerse biri FATAL ERROR dönecektir.

Kod çalıştığında 1 kez “Oluşturdum!” ve 4 kez “Zaten Vardım!” yazması gerekiyor. Buradanda şunu anlıyoruz 1 kere nesne oluşturulmuş ve diğer 4 nesne oluşturma girişimlerinde daha önceden oluşturulup RAM’e yüklenmiş olan object bize verildi.

Konu hakkında biraz daha bilgi isterseniz http://phpnedir.net/Page_singletonPattern.do buradaki kısa yazımı okuyabilirsiniz.

İyi Çalışmalar.

 

Google URL Kısaltma Servisi

08 Mar

Merhaba,

Google’un URL kısaltma servisini kullanmak istiyorsanız aşağıdaki şekilde gerçekleştirebilirsiniz.

<?php
namespace webServices{
	class GoogleURL{

		private static $url;

		public function __construct(){}
		public function __destruct(){}

		public function _get(){
			define("serviceURL","http://ggl-shortener.appspot.com/?url=");
			$url      = serviceURL.urlencode(self::$url);
			$request  = file_get_contents($url);
			$response = (array)json_decode($request);
			$result = "<a href='".$response["short_url"]."' target='_blank'>".$response["short_url"]."</a>";
			return $result;

		}

		public function _set($longURL){
			self::$url = $longURL;
		}
	}
}
?>

Kullanımı;

namespace {
	$shortURL = new \webServices\GoogleURL();
	$shortURL->_set("http://www.hakandamar.com");
	print($shortURL->_get());  //http://goo.gl/7aVg
}

Çıktı olarak yeni bir Tab/Pencere ‘de açılan HTML link kontrolü döner. Link’e göre orjinal URL’e ulaşmakta mümkündür.

İyi Çalışmalar.

 
3 Comments

Posted in PHP

 

Gelişmiş TC Kimlik No Algoritma Kontrolü

08 Mar

Merhaba,

Bildğiniz üzere TC kimlik no sorgulama web servisi açıldıktan bir süre sonra paralı olarak hizmet vermeye başladı. Eğer kullanıcılardan alacağımız TC kimlik no bizim için önemli ise bunun kontrolünü gerçekleştirmemiz gerekmektedir. Bu object ile girilen TC kimlik numarasının algoritmasını kontrol ederek, en azından geçerli bir TC kimlik no mu? değil mi? bunu bilebiliriz.

Eğer web servisi hizmeti alıyorsanız bile geçersiz sorgu istekleri ile ekstra ücret ödemek istemiyorsanız, sorguyu web servisine göndermeden önce bu object ile algoritmasını kontrol etmenizi tavsiye ederim.

TC Kimlik No Controller Object v0.1;

<?php
/**
 * Tc Kimlik No Algoritma Kontrolü
 * @author Hakan DAMAR
 * @link http://www.hakandamar.com
 */
namespace Securty{

	class Controller{

		private static $tcNo;
		protected $errCount;

		public function __construct(){
			// maybe use later...
		}

		protected function _tcNoCheck(){
			//Default Error Counter
			$this->errCount = 0;

			// For Controller
			$isDouble = is_double(self::$tcNo);
			$size     = strlen(self::$tcNo);
			$type     = gettype(self::$tcNo);

			// First Controller
			if(self::$tcNo == "" || self::$tcNo == null || self::$tcNo == 0){
				$this->errCount = 5;
			}else if($size != 11 && $type != "integer"){
				// Data Type Size Controller
				$this->errCount = 1;
			}else if($type == "integer"){
				// Type convert controller
				$this->errCount = 3;
			}else if($isDouble != true) {
				// Data Type Controller
				$this->errCount = 2;
			}else{
				// TC NO's
				$tc1;$tc2;$tc3;$tc4;$tc5;$tc6;
				$tc7;$tc8;$tc9;$tc10;$tc11;

				$tc1 = substr(self::$tcNo,0,1);
				$tc2 = substr(self::$tcNo,1,1);
				$tc3 = substr(self::$tcNo,2,1);
				$tc4 = substr(self::$tcNo,3,1);
				$tc5 = substr(self::$tcNo,4,1);
				$tc6 = substr(self::$tcNo,5,1);
				$tc7 = substr(self::$tcNo,6,1);
				$tc8 = substr(self::$tcNo,7,1);
				$tc9 = substr(self::$tcNo,8,1);
				$tc10 = substr(self::$tcNo,9,1);
				$tc11 = substr(self::$tcNo,10,1);

				//First Algo. Checks
				$algoCheck1 = (($tc1 + $tc3 + $tc5 + $tc7 + $tc9) * 7);
				$algoCheck2 = abs(((($tc2 + $tc4 + $tc6 + $tc8) - $algoCheck1) % 10));
				$algoCheck3 = (($tc1 + $tc2 + $tc3 + $tc4 + $tc5 + $tc6 + $tc7 + $tc8 + $tc9 + $tc10) % 10); 

				if($algoCheck2 != $tc10){
					$this->errCount = 4;
				}

				if($algoCheck3 != $tc11){
					$this->errCount = 4;
				}
			}

			// Error Controller
			$errControl = self::errorHandler($this->errCount);
			if($errControl != 200){ // 200 HTTP OK!
				print($errControl);
				exit;
			}else{
				$result = "<font color='green' size='+2'><b>GEÇERLİ T.C. Kimlik No.</b></font>";
				//$result = true;
				return $result;
			}

		}

		protected function errorHandler(){
			$errID = $this->errCount;
			switch ($errID) {
				case 0:
					$err = 200;
					break;
				case 1:
					$err = "<font color='red' size='+3'><b>T.C. kimlik no 11 haneli olmak zorundadır!</b></font>";
					break;
				case 2:
					$err = "<font color='red' size='+3'><b>T.C. kimlik no sadece sayısal girilmelidir!</b></font>";
					break;
				case 3:
					$err = "<font color='red' size='+3'><b>T.C. kimlik no 0(sıfır) ile başlayamaz ve 11 hane olmak zorundadır!</b></font>";
					break;
				case 4:
					$err = "<font color='red' size='+3'><b>Geçersiz T.C. kimlik no!!!</b></font>";
					break;
				case 5:
					$err = "<font color='red' size='+3'><b>Bu alan boş bırakılamaz!</b></font>";
					break;
				default:
					throw new Exception("<font color='red' size='+3'><b>Beklenmedik bir hata meydana geldi!</b></font>");
				break;
			}
			return $err;
		}

		public function _get(){
			return self::_tcNoCheck();
		}

		public function _set($tcNo){
			self::$tcNo = $tcNo;
		}
	}
}
?>

Kullanımı;

namespace {

	$tcController = new \Securty\Controller();
	$tcController->_set(92108806946);
	print($tcController->_get());

}

Bir kontrol için bu kadar çok kod olması gözünüzü korkutmasın.
1 kontrolü benim pc’im de 0.2ms’de gerçekleştiriyor.
Söz konusu bir server olunca bu süre dahada kısalacaktır.

İyi Çalışmalar.

 
2 Comments

Posted in PHP

 

PHP NameSpace Kullanımı

22 Feb

Merhaba,

Bildiğiniz üzere PHP,  5.3.x versiyonundan itibaren NameSpace ‘i desteklemeye başlamıştı. PHP 6.x ile OOP adına bir çok şeyin yerine oturmasını bekliyorum ve PHP 6′yı sabırsızlıkla bekliyorum.

Öncelikle NameSpace’ler hakkında kısa bir bilgi verelim ve hemen örneklere geçelim. NameSpace yani İsim Alanları PHP’de benzer isimdeki class,constant ve function’ları aynı sayfa/proje içerisinde kullanmamızı sağlar ve daha okunabilir ve anlamlı object mimarileri kurmamızı sağlar. Windows File System olarak kafanızda canlandırabilirsiniz.

X:\ sürücü altına bir klasör oluşturup herşeyi bunun içine koyduğunuzu düşünün. İçindeki dosya sayısı 1.000′i geçtiğinde veya yaklaştığında, artık içinde bir şey bulmanız zorlaşacaktır. NameSpace’leri PC’ye uyarlarsak. A0023.jpg diye bir dosyanızın olduğunu varsayalım. Bu dosyayı X:\ sürücüsünün içindeki 10,000 dosya içerisinde aramak mı daha kolay? Yoksa X:\ sürüsünün altına X:\Photos\Summer\2009\A0023.jpg diye bir path’te bulmak mı? NameSpace’ler de bu şekilde kodlarımızı ayırmamızı sağlar. Yine WFS(Windows File System)’de olduğu gibi X:\Photos\Summer dizini altına  foo.txt diye bir dosya oluşturabileceğiniz gibi X:\Photos\Summer\2009 dizini altınada aynı isimde bir dosya oluşturanız WFS size karışmayacaktır.

Aynısını NameSpace’e göre açıklarsak; fooPage.php içerisinde  namespace spaceOne {  const fooC = 9; } ve namespace spaceTwo{ const fooC = 7; } diye yazdığımızda ikitane aynı isimde constant olmasına PHP kızmayacaktır. Çünkü farklı namespace’ler de bulunmaktalar. WFS’e göre farklı dizinler diye düşünebilirsiniz.

Şimdi örnek ile namespace kullanımını ve namespace içerisinde farklı bir namespace’i kullanmayı görelim;

<?php
/**
 * PHP | NameSpace
 * @author Hakan DAMAR
 * @link http://www.hakandamar.com
 */
declare(encoding="UTF-8");

namespace mainSpace{

 const conn_open = 1;
 class Connection{}
 function Connect(){}

}

namespace secondSpace{
	const conn_open = "Connected";
	class Connection{}
	function Connect(){}
}

namespace childSpace{
	use secondSpace as ss;
	function getConnectionStatus(){
		$conn_open = ss\conn_open . "!!!";
		return $conn_open;
	}
}

namespace {

	print(\mainSpace\conn_open."<br/>");
	print(\secondSpace\conn_open."<br/>");
	print(\childSpace\getConnectionStatus());

}
?>

Örnektende anlaşılacağı üzere namespace’ler namespace <nameSpace Adi> şeklinde tanımlanır. Peki, en altta isimsiz bir namespace var? O global namespace’dir.
İçerisinde hem diğer namespace’leri çağırabilirsiniz hem de normal PHP kodlarınızı yazmaya devam edebilirsiniz.
En üstteki declare() metodu object’in encoding’ini belirtmek için kullanılmaktadır. enconding haricindeki Diğer property’leri namespace kullanılan sayfalarda kullanılamaz!

Bir de childSpace’de use secondSpace ile seconSpace’i çağırdık ve as ss ile secondSpace ismini ss keyword’ne atadık. Değişken tanımlamak gibi düşünürsek $ss = “secondSpace”; dir.
Bundan dolayıda artık secondSpace’i ss temsil edecektir. Bu nedenle $conn_open variable’ın da secondSpace\conn_open yerine ss\conn_open kullanılmıştır.

NOT: namespace tanımı üzerinde declare(); metodu hariç hiç bir kod olamaz, aksi taktirde PHP Compiler ERROR dönecektir.

İyi Çalışmalar.

 
2 Comments

Posted in PHP

 

PHP ile MAC adresi alma

20 Jan

Merhaba,

Normalde yoğun şekilde ihtiyacımız olan bir bilgi değil fakat Extreme Web Application veya Securty Tool geliştiriyorsak işimize yarayacak bir bilgidir. MAC adresi her ne kadar eşsiz olarak söylensede değiştirilebildiğini hepimiz biliyoruz. :)

Çalıştırdığım sistem Windows Server 2K8 + PHP 5 (FastCGI Module)

Localhost’ta çalışıyorsak şimdi Windows Command Line’a geçip ipconfig /all yazalım.

Yukarıdaki gibi bir ekran çıktısı ile karşılaşıyoruz. Şimdi bu bilgileri PHP tarafında alsak ve bir metod olsa aynı command line gibi kullanabilsek güzel olmaz mıydı? Hepimizin aklına ilk anda exec() metodu gelebilir fakat bu değil. :) System() metodunu kullanacağız.

<?php
ob_start();
system('ipconfig /all');
$buffContent=ob_get_contents();
ob_clean();
$searchtxt = "Physical Address"; //Linux ise -> "Physical"
$pmac = strpos($buffContent, $searchtxt);
$mac = substr($buffContent,($pmac+36),17);
print("MAC Adresiniz: ".$mac); // MAC Adresiniz: 00-40-D0-C9-48-C7
?>

Şimdi kodumuzu kısaca açıklayalım.

Öncelikle System() metodundan dönen datayı arabelleğe alıp sonra arabellek içeriğini temizliyoruz ve arabellekteki veri üzerinde arama ve bir takım düzenleme işlemleri ile bize dönen string veriyi filtreleyerek içinden istediğimizi alıyoruz. Dönen sonucu direkt görmek isterseniz ob_clean() metodunun hemen altında print($buffContent); exit; yazınız.

Çıktısında size üzerinde çalıştığı makinenin ilk MAC adresini dönecektir. Birden fazla ethernet bağdaştırıcısı olabilir. Bu durumda substr() metoduna vermiş olduğumuz start ve end point sayılarını değiştirmemiz gerekmektedir.

UYARI: Bu MAC adresi istemcinin(Client) değil scriptin çalıştırıldığı makinenin(Server) MAC adresidir.

İyi Çalışmalar.

 
No Comments

Posted in PHP

 

Mobile Code Creator

07 Oct

Merhaba,

Bu aralar hep web servislerinden gidiyorum. İşte hazır Google’da barkod’un icadını kutlarken, mobile code oluşturabileceğiniz bir servis.

http://webservices.oxijen.org/Services/MobileCode/

İsteğe göre Link ekleme ve vCard oluşturma özelliklerinide ekleyebilirim.

Şimdilik GET metodu ile 2 tane parametre alıyor.

@param msg (String) – Oluşturmak istediğiniz kodu string olarak vermeniz gerekiyor. (HTML kodu yorumlamaz. Sadece yalın text göndermelisiniz.)

@param msgName (String) – Oluşturduğunuz mobile code’a vermek istediğiniz bir ad. İsteğe bağlıdır. Bu alana genellikle cep telefonu numarası girilir.

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

Free XMLocation Web Service

29 Sep

Merhaba,

Geliştirdiğimiz web uygulamalarında bazen kullanıcının bir takım bilgilerini almak isteyebiliriz. Böyle bir durumda giren kullanıcının IP‘sine göre Ülke/Bölge/ISP/Bayrak gibi bilgileri bize sağlayan web servislerinden yararlanırız. Bu web servisleride genelde ücretli olur. :) İnternette farklı bir konu üzerinde araştırma yaparken dikkatimi çeken ücretsiz bir web servisi için basit bir kod yazdım. Aşağıdaki kod ile bu ihtiyacınızı ücretsiz sağlayabilirsiniz.

Demo: http://webservices.oxijen.org/Services/XMLocation/

  1.  
  2. <?php
  3. header("content-type: text/html; charset=utf-8");
  4. $clientIP = $_SERVER["REMOTE_ADDR"];
  5. $request = "http://services.gabbara.com/xmllocation/?IP=".$clientIP;
  6. $readRequest = file_get_contents($request);
  7.  
  8. $xml = new SimpleXMLElement($readRequest);
  9. $flagIMG = "<img src=’".$xml->FlagPath."’ />";
  10. $shortCN = $xml->ShortName;
  11. $longCN = $xml->LongName;
  12. $region = $xml->Region;
  13. $ipCity = $xml->IpCity;
  14. $isp = $xml->ISP;
  15. $ispDomain = $xml->IPDomain;
  16. ?>
  17. <html>
  18. <head>
  19. <title>XMLocation Free Web Services</title>
  20. </head>
  21. <body>
  22. <p>
  23.         <b>Country:</b> <? print($shortCN)?>/<?=$longCN?><br/>
  24.         <b>Flag:</b> <?=$flagIMG?><br/>
  25.         <b>Region:</b> <?=$region?><br/>
  26.         <b>City:</b> <?=$ipCity?><br/>
  27.         <b>ISP:</b> <a href=‘http://<?=$ispDomain?>’ target=‘_blank’><?=$isp?></a>
  28. </p>
  29. </body>
  30. </html>
  31. <?php
  32. ?>
  33.  

Bu güzel ama benim işimi görmez ben kendi database’im üzerinden bu işlemleri yapmam gerekiyor diyorsanız. O zaman buradan 180MB civarındaki SQL’i indirip kullanabilirsiniz. :)

iyi çalışmalar.

 
No Comments

Posted in PHP

 

PHP Performans Testi

27 Sep

Merhaba,

İnternette dolaşan astronomik değerlerden sıkıldığımdan dolayı kendim güncel bir test yaptım. Yaptığım testlere göre sonuçlar aşağıdaki şekilde çıktı.

Testleri gerçekleştirdiğim makinenin konfigürasyonuna http://tinyurl.com/y8lkg5p buradan bakabilirsiniz.

Diğer Değerler;

  • Web Server: IIS 7.5
  • PHP Version: 5.2.10
  • Setup Mode: CGI/FastCGI
  • Browser: Firefox 3.5.2
  • OS: Windows 7 (x64)

Küçük boyutlu test sonucu;

8 Milyonluk bir döngü sonucunu: 0.98745512962341 saniyede getirdi.

Orta boyutlu test sonucu;

350 Milyonluk bir döngü sonucunu: 43.498991012573 saniyede getirdi.

Büyük boyutlu test sonucu;

1 Milyarlık bir döngü sonucunu: 123.0937769413 saniyede getirdi. (Ortalama 2 dk.)

Buda demek oluyor ki araya yazılımsal ve donanımsal caching + diğer performans yöntemleri ile büyük boyutlu bir sitemiz bile olsa hala rahatlıkla PHP’yi kullanabiliriz. :)

Genel Sonuç: print(“Yaşasın Open Source :D ”);

İyi Çalışmalar.

 
2 Comments

Posted in PHP

 

1.0 PHP ile Nesne Yönelimli Programlamaya Giriş

23 Sep

Merhaba,

Bu makalede PHP ile Object-oriented Programming(Nesne Yönelimli Programlama) giriş yapacağız. Makale giriş seviyesi fakat NYP(Nesne Yönelimli Programlama) ileri seviye bir konu olduğundan, PHP ile yeni web uygulamaları geliştirmeye başlayan kişilere tavsiye etmiyorum. Öncelikle PHP’de bir seviye uzmanlaşmakta fayda var. Yoksa bu makaleler zor ve öğrenmesi güç gelecektir.

Bilindiği üzere Class(Sınıf)’lar metodların birleşmesinden oluşur. PHP ile hazır gelen ve kendi oluşturabileceğimiz metodlar vardır. Bunlardan ilk iki tanesi __construct ve __destruct metodlarıdır.

__Construct Metodu; Object(Nesne) ilk yüklediği anda çalıştırılacak kodların bulunduğu bölümdür.  Daha önce ASP.NET ile web programlama yapmış arkadaşlar bunu Page_Load() methoduna benzetebilirler. PHP 4’te bu Class’ın adı ile aynı bir method oluşturarak mümkündü fakat PHP 5 ve sonrasında bunun yerine __construct() methodu getirildi.

void __construct ([ mixed $args [, $... ]] )

__Destruct Metodu; Bu metod ise nesne ile işimiz bittiğinde otomatik çağırılan metottur. İstersek manuel de çağırabiliriz.

void __destruct ( void )

Şimdi bu metodları bir örnek üzerinde inceleyelim.

Gördüğünüz gibi ilk önce __construct() metodu çalıştı ardından sayfa içerisindeki kodlar sonuna kadar çalıştırıldı ve en son olarak __destruct() metodu çağırıldı. Construction’da class içerisinde bolca kullanacağımız parametreler verilebilir. Destruction’da ise açık veri tabanı bağlantıları, session yok etme, hafızayı temizleme, arabelleği boşaltma v.b. gibi işlemler yapılabilir. Bunları ilerleyen makalelerde bolca kullanacağız. Bir class’ı new komutu ile oluşturacaksanız public olarak __construct metodunu kullanmalısınız. Fakat PHP’de __construct() ve __destruct() metodları olmadanda bir class oluşturmanız mümkündür.

__AutoLoad() metodu,  daha önce projelerimizde kullandığımız require_once() ve include_once() metodlarına benzemektedir. Fakat bunu class içerisinde otomatik yaparak bizi, acaba şu class’ı veya interface’i include(dahil etmek) ettim mi? Sorusundan kurtarır.  Bu metodu daha verimli kullanmak için class’larımızı ve interface(Arayüz)’lerimizi hiyerarşik yapıdaki bir klasörde tutmamızda fayda var. Anlatmak istediğimi bir örnek üzerinde inceleyerek pekiştirelim.

Klasör yapımız aşağıdaki şekilde olsun;

+ Proje

++ library

+++ testClass.php

+++ denemeClass.php

index.php

Metodumuzu aşağıdaki şekilde yazarsak Class’larımızı otomatik yükletebiliriz.

  1. __autoload("test");
  2.  
  3. ?>

Bu Class’ımız içerisinden çağırmak için kullanabileceğimiz bir yöntem. Fakat uygulamamız içerisinde, daha önceden hiç bir nesne oluşturmadan __autoload() adında bir fonksiyon yazarakta yapabiliriz. Gördüğünüz üzere yukarıdaki __autoload() metodunu çağırmak için new komutu ile önceden test() adında bir nesne oluşturuyoruz. Bunun yerine aşağıdaki şekilde bir fonksiyon ile de çözebiliriz.

Yukarıdaki fonksiyonu direkt olarak uygulamamızın içerisinde istediğimiz bir yerde, yeni bir nesne oluşturmadan __autoload(string <param>); şeklinde kullanabiliriz.

Not: __autoload() bloğu içerisinde oluşan hatalar catch bloğu ile yakalanamaz!

Erişim Hakları; Nesne içerisindeki bir değişkenin veya metodun nerelerden erişilebileceğini belirlememizde bize yardımcı olan komutlardır. Public, Private, Protected olarak 3 türü mevcuttur.

Public; Bu şekilde tanımlarsak heryerden erişilebilir olduğunu bildiririz. Eğer bir metodun başına hiç bir şey belirtmeden direkt tanımlarsak PHP bunu varsayılan olarak public(paylaşılan) olarak kabul eder. PHP 4’te public yerine kullandığımız var anahtar’ı geriye uyumluluk adına desteklenmektedir fakat PHP’nin 5.1.3 sürümünden önceki bir sürüm üzerinde uygulama geliştiriyorsanız bu E_STRICT uyarısına sebeb olur.

Private; Sadece tanımlanan Class(Sınıf) içerisinden erişilebilir.

Protected; Bu tür tanımlanan metod veya değişkenler sadece ilgili Class içerisinden veya türetilen Class içerisinden erişilebilir. Public gibi dışarıdan erişimi mümkün değildir.

Zend Studio gibi gelişmiş bir PHP IDE’si kullanıyorsanız zaten yeni bir nesne oluşturduğunuzda size Private ve Protected olarak tanımlanmış metod ve değişkenleri göstermeyecektir. Şimdi bunları bir örnek ile inceleyelim.

Zend Studio 7

Gördüğünüz gibi Zend Sutdio’da nesnemizi oluşturduğumuzda bize sadece public metod ve değişkenleri göstermektedir. Aksi taktirde uygulamamız Fatal Error(Ölümcül Hata) ile sonlanır.  Burada _getInfo() ismi ile tanımladığımız bilgi veren metodumuz biraz kafanızı karıştırabilir. Hani private ve protected metodlara dışarıdan erişilemezdi? gibi bir soru ortaya çıkabilir. Biz nesnemizdeki _getInfo() metodunu public olarak oluşturduk ve çağırdık. _getInfo() metoduda class içerisinde olduğundan yine class içerisindeki private,protected ve public değişkenlere erişme hakkı var. Yani biz metodu call(çağırmak) ediyoruz. O metod kendisi erişebildiği değişkenlerin değerlerini bize gösteriyor.

Protected erişim türünü daha iyi inceleyebilmek için, şimdi childClass() isminde yeni bir class oluşturarak bunu parentClass()’mızdan türetelim.

$degisken3 isimli değişkenin değerini burada override(ezmek) ederek değiştiriyoruz. Böylece artık $değişken3 türeyen class’ımızda atadığımız değere göre işlenecektir. Bu nedenle $foo2 nesnemizin _getInfo() metodunu çağırdığımızda ”Ben hem class içerisinden hemde türetilen class’lardan erişilebilirim.” değeri yerine “Değerini değiştirdik.”  yazısını göreceğiz. Hepimizin bildiği gibi başındaki br tag(etiket)’i HTML’e özel bir tag olduğundan tarayıcımız bunu yorumlayarak göstermemektedir. Bu nedenle çıktıda gözükmemektedir.

İyi Çalışmalar.

 
No Comments

Posted in PHP