Frameworkler birer birer Namespace yapısına geçmeye başladı. Bu da konunun daha çok konuşulmasına ve soruların artmasına neden oldu. Şu adresteki soruları incelemenizi istiyeceğim ( php namespaces at stackoverflow ) 188 çok değil ama zamanım oldukça oradaki soruları da analiz etmeye çalışacağım.

Namespace, bilindiği üzere birçok dilde zaten kullanılan bir yöntem, ve bana göre kütüphanelerin birleştirilmesi / farklı geliştiricilerin oyuna dahil olması anlamında çok gerekli bir özellik. Kısaca neden kullanırız? Bize ne sağlar? Ve buna PHP tarafından bakarsak, nasıl kullanırız? Nelere dikkat etmemiz gerekir bunları yazmaya çalışacağım. Sadece yazılımsal (syntactic) olarak değil, anlamsal olarak da (semantic) bize sağlayacağı kolaylık ve zorluklardan bahsetmek istiyorum.

Hiç namespaces hakkında bilginiz olmadığını düşünerek şöyle somutlaştırmak istiyorum, Tufan diye bir arkadaşınız olduğunu düşün, arkadaşlar arasında bahsederken Tufan onu tanımlar, ve yeni bir Tufan arkadaşınız olunca artık “hangi Tufan?” soruları başlar öncelikle. Problem burda başlar ve siz buna bir çözüm bulursunuz, “Yıldırım Tufan” evet. Çözdünüz. Yazılımda bu problemin çözümü de Namespace ile gelmiş oluyor. Hangi PDF sınıfı? Zend\Pdf sınıfı.

Artık teknik olarak devam edelim,

Namespace Tanımlama:

0
1
2
3
4
5
6
7
8
<?php
namespace Uygulamam
{
 /**
  * Standart olarak bu parantezler arasına yazılacak herşey  "Uygulama" içine dahil olacaktır.
  * çağırılırken bu alanda değilsek  \Uygulama\ önadını kullanacağız.
  */
}
?>

Alternatif bir yazım şekli olarak parantezleri kullanmama özgürlüğmüz de var

0
1
2
3
4
5
6
<?php
namespace Uygulamam
   /**
   * Standart olarak bu satırdan sonra yazılacak herşey  "Uygulama" içine dahil olacaktır.
   */
 
?>

İç içe namespace tanımlamak istediğimizde de “\” ters slash kullanabiliriz, kısaca ornek verelim, namespace, fonksiyonları ve classları özelleştirmemizi sağladığı gibi, namespaceleri de bir namespace dahil ederek özelleştirebiliriz gayet basit.

0
1
2
<?php
   namespace Uygulamam\Mobil\Android;
?>

Normal şartlarda, her namespace için bir dosya kullanmamız önerilir, fakat siz tek dosyada birden fazla namespace kullanmak istiyorsanız, bunların birbirilerini nasıl etkileyeceğini bilmelisiniz, “Mobil” namespace  için tek dosya kullanmak istiyorsak örnek verelim

Bir dosyada birden fazla namespace tanımlarken, parantez kullanımına dikkat etmeliyiz, parantez kullanıyorsak bu namespace içine bir namepsace tanımlanamaz yani kısaca “namespace Uygulama {   namespace Mobil {  }   }“  gibi bir yazım hata sebebedir.
ve aynı dosyada herhangi bir namespace ait kodlar da bulunamaz. Örneği vermeden önce de şunu söylemek gerekiyor ki; alt namespaceler tanımlarken sahip namespace (örn : Uygulama) nin tanımlanmış olmasına gerek yok. Yani biz Uygulama diye bir namespace tanımlamadan Uygulama\Mobil ya da Uygulama\Mobil\Android diye namespace tanımlayabiliriz.

Örnek :

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
//library.php olsun.
namespace Uygulamam\Mobil\Android
    {
        class View
        {
            public function view()
            {
                print 'I will include a view file for ' . __NAMESPACE__;
            }
        }
    }
 
    namespace Uygulamam\Mobil\IPhone
    {
        class View
        {
            public function view()
            {
                print 'I will include a view file for ' . __NAMESPACE__;
            }
        }
    }
 
  namespace Uygulamam\Mobil
  {
     $b = new Android\View();
     $b->view();
  }
 
?>

Örneği çalıştırmanızı rica ediyorum, ve tek dosyada incelemek istediğimiz için böyle bir yazım yaptık, şimdi analiz edelim,

Uygulamam\Mobil\Android ve Uygulamam\Mobil\IPhone alanlarına aynı isimde, aynı medodlara sahip “View” adında bir class tanımladık,  kullanım kısmındaki ayrıntıyı da gösterebilmek için son namespacei “Uygulamam\Mobil” olarak tanımladım, böyle tanımlamak zorunda mıyız? tabi ki hayır, bu namespace içine yazacağımız ve çağıracağımız herşey Uygulamam\Mobil namespace içine dahil olacaktır. Önce kendimizi bir Namespace içine dahil ettik, sınrasında yazdığımız “new Android\View()“  terimi  başında “\” olmadığı için dahil olduğumuz namespace içindeki “Andorid” anlamına geldi yani ” \Uygulamam\Mobil\Android“  oldu çıktıyı da incelersek

“I will include a view file for  Uygulamam\Mobil\Android” Şimdi yeri gelmişken __NAMESPACE__ sabitini de inceleyelim. Tahmin edebileceğiniz gibi bulunduğumuz namespacei tespit etmemizi sağlayan bir sabit (her namespace için değişiyorsa bu nasıl sabittir ?)  sihirli sabitler diye türkçeye çevirebileceğimiz “Magic Constatns” konusunu inceleyebilirsiniz,

“Use”

Karmaşık ve iç içe çok namespace içeren projelerimizde, uzun isimler olacaktır  Örnek : “namespace Uygulamam\Mobil\Android\WebServices\NuSoap” bu alanlar içindeki sınıf ve fonksiyonlara ulaşmak istediğimizde, bu pathı tekrar tekrar yazmak elbette hoşumuza gitmeyecektir, namespace bir zorluk olaacaktır. “use” keywordu bize bu sınıflara o blok içinde kısa isimler vermemiz konusunda yardımcı olacak. Önceki dosyamızın adı “library.php” olsun ve bahsettiğimiz namespacei içine 2 sınıfla beraber tanımlayalım.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// libraray.php'nin devamı
namespace Uygulamam\Mobil\Android\WebServices\NuSoap
    {
        class Users
        {  
            public function getUsers()
            {
                return array('User 1','User 2');
            }
        }
 
        class Posts
        {
            public function getPosts($userId)
            {
                return array('Post 1','Post2 2');
            }
        }
    }
 
?>
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
  /**
  *  Bu uzun ismi her sınıf için tekrar yazmamak için bir alias tanımadık.
  *  artık kısaca Webservice\Users gibi ulaşabiliriz
  */
  use \Uygulamam\Mobil\Android\WebServices\NuSoap as WebService;
 
  include 'library.php';
 
  $usersService = new WebService\Users();
  $postService = new WebService\Posts();
 
  $users = $usersService->getUsers();
 
  var_dump($users);
 
  //output
  /**
     I will include a view file for Uygulamam\Mobil\Android
     array(2) {
      [0]=>
      string(6) "User 1"
      [1]=>
      string(6) "User 2"
    }
  */
?>

“use ” kullanabilmek için bu namespacein tanımlanmış olmasına gerek yok, bu yüzden okunabilirlik için “use” bloklarını hep en üstte tutmaya çalışın. Sadece çağrılınca bunun varlığı kontrol edilir. biz de zaten sonrasında include “library.php” diyerek tanımlamış olduk.

yani şu iki satırın anlamı kısaca şöyledir.

0
1
  $usersService = new WebService\Users(); // new  \Uygulamam\Mobil\Android\WebServices\NuSoap\Users();
  $postService = new WebService\Posts(); // new  \Uygulamam\Mobil\Android\WebServices\NuSoap\Posts();

— buraya trickler, hatalara sebep olabilecek kullanımlar vs. gelecek –

Not:  Lütfen, eklemek, düzeltmek, sadeleştirmek istediğiniz şeyler varsa, yorum / mail olarak atabilirsiniz, “PHP Namespaces” için kapsamlı bir döküman oluşması konusunda yardımcı olan herkese şimdiden teşekkür ediyorum.

This function can be used for sorting a multidimensional array by sql like order by clause

Uzun yazamicam sanırım, onaydan sonra paket burada, incelemek isterseniz :

http://www.phpclasses.org/package/7041-PHP-Find-the-name-of-a-color-closer-to-a-given-color.html

Merhaba arkadaşlar, takip edenler benim ilk zamanlardan beri yaptıklarımı paylaştığımı bilmekle beraber benim hiç kullanmadığım sınıflar yazdığımı da bilir. Bir araç olabiliyorsa o yazacağınız şey kesinlikle ihtiyacı olan da çıkıyor, Bugüne kadar yazdığım her sınıfa sonradan ihtiyaç duymuşumdur ya da ihtiyacı olan birinin kullandığını görmüşümdür. Eveet bu saatte böyle girilir blogposta kızmak yok okumaya devam. Resimleri renklere göre gruplarken renk töleransı ile ilgili birşeyler yapmaya çalışıyordum, sonrasında da aslında tölerans değil de bana verdiğim renge en yakın isimlendirilmiş renk lazım dedim. Başladım okumaya ve kodlamaya, RGB,HS ve Color Palette benim her zaman üzerinde hesaplar ve çalışmalar yaptığım bilgilerdir, her zaman da beni bu konularda farklı kılmıştır. Seviyorum sizi (:
Az önce phpclasses.org’a attığım sınıf işte tam buna yarıyor, verdiğiniz renk kodunun isimlendirilmiş 1500 renk arasından en yakının adını veriyor size (bu renkleri türkçeleştirip veren biri olursa blogroll’e eklicem).

Şimdilik bu kadar, yayınlanınca direk ordan kod vereceğim, artık blogumda kod kalabalığı yapmayı düşünmüyorum

Merhabalar,
Olay güdümlü (EvendBased) programlama bize her alanda lazım olabilecek, ve bazı yerlerde kod kalabalığı yerine işlemleri bölebilmemize yarayabilecek bir metod, daha önce Csharp kategorisinde event based programming ile ilgili ufak bir örnek yapmıştım, bu örneği bir de php ile göstermek istedim, open source scriptlerin çoğu, hatta hepsi diyebiliriz event’ları plugin amaçlı kullanmaktadır. Aslında bi bakıma doğru bir yaklaşım çünkü modüleriteden farklı ama aynı zamanda modüleriteyi sağlayabilecek yapıyıbir arada ancak böyle yazabilirsiniz.

Abstract:

  • Anasayfa
    • Header
      • Header başlamadan önceki işlemler (BeforeHeader Event)
      • Gerçek header işlemleri
      • Header sonrası işlemler (AfterHeader Event)
    • Content
      • Content başlamadan önceki işlemler (BeforeContent Event)
      • Gerçek content işlemleri
        • Postlar
          • Post Öncesi işlem (BeforePost Event)
          • Post İşlemi
          • Post Sonrası işlemler (AfterPost Event)
        • Pagination
      • Content sonrası işlemler (AfterContent Event)

Bu event flaglari tam burada yapılacak işlem var mı diye kontrol edilip varsa çalışıtırılan, gerekirse kendisinden sonraki işlemi etkileyebilecek processleri yürüten kısımlardır. Bizim de kendi scriptlerimizde, olay noktalarımız ve bu noktalarda tetiklenmesi gereken diğer olayları kontrol eden bir mekanizmamız olsun istiyoruz. O halde. Öncelikle basit bir event.bind ve event.run metodları olan bir sınıf hazırlayalım

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
	class event
	{
		#callbacks array.
		private static $flags = array();
 
		/**
		* register a callback for an event point.
		*/
		public static  function register($event_point,$callback)
		{
			self::$flags[$event_point][] = $callback;
		}
 
		/**
		* run event_points callback at this time!
		*/
		public static function run($event_point)
		{
			if(isset(self::$flags[$event_point]))
			{
				foreach(self::$flags[$event_point] as $callback)
				{
					if(is_callable($callback))
					{
						call_user_func($callback);
					}
				}
			}
		}
	}
 
?>

sınıfımız basit olarak verilen fonksiyonu belirttiğimiz point name ile saklıyor ve run() denilen yerde o point name için verilmiş tüm callbackleri çalıştırıyor. aşağıdaki bir sayfamız olduğunu düşünelim,

0
1
2
        event::run('before_header');
	echo "burası header";
	event::run('after_header');

bu sayfamızda, headerdan önce ve sonra bir event point var, header oncesinde ve sonrasında yapaağımız işlemlerde artık headera dokunmadan “event” sınıfımızı kullanarak yapabiliriz (plugin mantığı yani)
şimdi bir event register örneği yapalım.

0
1
2
3
4
5
6
7
8
9
event::register('before_header',function()
	{
		echo "header başlamadan önce bu event çalıştı";	
	});
 
 
	event::register('after_header',function()
	{
		echo "header bittikten sonra bu event çalıştı";	
	});

php mantığını unutmayalım register() fonksiyonları run() dan önce yazılmalı, sistemlerimizi buna göre yapalım. pek açık olmasa da php bilginize bağlı olarak pek zor bir iş olmayacaktır sizin için, sorularınız varsa bu post altına alabilirim, Teşekkürler

© 2012 Tufan Suffusion theme by Sayontan Sinha