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.

 
2 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.

 
4 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.

 
8 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.

 
3 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.

 
7 Comments

Posted in PHP