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.

Not : bu döküman güncelliğini şurada korumaya devam edecektir :) http://www.tufyta.com/php-namespace

merhaba arkadaşlar son stabil sürümü 5.3.1  kasım 2009′da yayınlanmıştı biliyoruz. 5.3 ile beraber  katılaşan şeyler olmaya başladı bu da dilin tutarlılığını arttırıyor bence.  stilinden vazgeçmeyip  yanlış kullanımlar yapan arkadaşlarımız artık kendilerini değiştirmeye mecbular.  bu düzenlemelerle beraber bir de NameSpace   olayı eklenmiş. C# ta da namespace diye geçer Javacılar Package diye  bilir vs.

0
namespace d3;

artık sınıflarımın sahbi bu (: tüm sınıflarımı d3 namespace altına yazmayı düşünüyorum. bu  aslında OOP nin temeli olan kalıtımdan %100 faydalanabilmemizi sağlayacak ve okunabilirliğini arttıracak.

namespaceleri farklı olan aynı isimde birden fazla class olabilecek artık. bunu da şu şekilde ayırt ediyoruz

0
use d3;

bunun altına oluşturmaya çalışacağımız sınıflar için ilk once d3 namespace altına bakılacak.
bununla beraber  yeni global constantlar ve constant çağırma metorları da geldi  artık sınıf içerisinde ya da dosyamızda

0
__NAMESPACE__

ile sahip uzayın adını çağırabiliyoruz.

0
1
__NAMESPACE__\QR_INDEX;
d3\QR_INDEX;

bunlarla da namespace içindeki constantları çağırabiliyoruz.

peki niye boyle bişey yazma gereği duyulmuş ?. şoyle açıklamak istiyorum arkadaşlar    dosya diskimiz için düşünelim.

/home/tufan /d3linq.php   dosyası olabilir  değil mi ? /home/d3lly/d3linq.php  dosyası da olabilir  yani bunlar aynı isimde  ama birbirinden farklı 2 dosya.
işte namespace bize bu kolaylığı veriyor..     d3\linq  dediğimizde benim linqim  zend\linq dediğimiz de de zendin linqini create etmiş olacaz..

Sub Namespace

0
1
2
3
namespace d3\sql\mssql;
  class mssql{ public $type=mssql; }
namespace d3\sql\mysql;
  class mysql{public $type=mysql;}

bu da subnamespace tanımlama yönteemi.

© 2012 Tufan Suffusion theme by Sayontan Sinha