Php 5.3 Namespace ler

October 1st, 2009

Bir uygulama nekadar büyür, nekadar cok yazar o uygulamada calisirsa, nekadar degisik tür kodlar, kütüphaneler kullanilirsa okadar cok isim cakismasi ola bilir.
En büyük örnegi php 5.1.0 cikmasindan bir kac gün sonra php 5.1.1 cikmasiyle görüldü, bunun nedeni php 5.1.0 da yeni Date adinda bir sinif bulunmasiydi.
Bircok Pear kullanicisi update den sonra Fatal Error larla karsilasmisdi cünki Pear inde Date Sinifi vardi.
Böyle bir cakismadan kacinmak icin simdiye kadar Zend Framework de oldugu gibi Uzun isimler kullanildi (Zend_Controller_Action).

Php 5.3 ile bu uzun isimlerdende kurtulmak mümkün.

php dünyasininen en uzun süre tartisilan seperator u kesinlikle namespace seperator oldu.
Asil cif iki nokta üstüste (::) kullanilicakti ama php dünyasinda cif anlamli olur diye sonunda (\) Backslah isaretinde karar kilindi.

Namespace kullana bilmek icin, php dosyasinda ilk ifade namespace olmasi gerekmektedir, aksi takdirde bir fatal error ile karsilasirsiniz.
mesela:

PHP:
  1. <?php
  2. namespace Skorp;
  3. echo "skorp.eu";

Bir namespace bircok dosyayi kapsiya bilir. Dosyalarin her biri ayni namespace i beyan etmeleri gerekir. Asagidaki örnekde göründügü gibi, bir dosya icinde birden cok namespace bulunmasinada izin veriliyor.

PHP:
  1. <?php
  2. namespace Skorp
  3. {
  4.  
  5. echo "skorp.eu";
  6. }
  7.  
  8. namespace Foo
  9. {
  10. echo "foo.com";
  11.  
  12. }

Ama asagidaki örnege izin verilmiyor, en az bir namespace beyan edilmisse onun disinda herhangi bir kod olamaz.

PHP:
  1. <?php
  2. namespace Skorp
  3. {
  4.  
  5. echo "skorp.eu";
  6. }
  7.  
  8. echo "gohome";

alinan hata mesaji:
Fatal error: No code may exist outside of namespace {} in

Bir örnek ile namespaceleri nasil kullanacagimizi bakalim.

PHP:
  1. <?php
  2. namespace Skorp
  3. {
  4.     class Test {}
  5. }
  6.  
  7. namespace Foo
  8. {
  9. class Test{}
  10. }
  11.  
  12. namespace Bar
  13. {
  14.     var_dump(new \Foo\Test());
  15. }

Bar namespace i icinde Foo namespacindeki Test sinifini olusturuyoruz.

var_dump satirini su sekilde yazmis olsaydik:

PHP:
  1. var_dump(new Foo\Test());

söyle bir hata ile karsilasicaktik.
Fatal error: Class 'Bar\Foo\Test' not found in

Bundan Adreslemeye dikkat etmemizi cikartiyoruz, normal bilgisyardaki Dosya Yapisi gibidir namespace de basta \ isareti yoksa kendi namespace icinde ara o sinifi.

Alias Mekanizmasi
Herzaman \Foo\Test veya daha uzayan satirlar kullanmamak icin Alias mekanismasini kullana biliriz.

PHP:
  1. namespace Bar
  2. {
  3.     use Foo\Test as anton;
  4.     var_dump(new anton());
  5. }

daha kisa yazmak icin

PHP:
  1. namespace Bar
  2. {
  3.     use Foo\Test;
  4.     var_dump(new Test());
  5. }

Bu kisa yöntemde en son bilesen adi kullanilir alias olarak yani bizim örnegimizde Test

dikkat edilmesi gereken birsey daha var alias mekanizmasini kullanirken \ yazmamiza gerek yok, php burda sinif adinin tam yolunu bilmek istiyor.

Fonksiyonlarda bilinmesi gereken ise, onlara birer Alias veremiyoruz, ondan fonksiyonun tüm adini yazmak gerekiyor.
yazilan fonksiyonlar ilk önce kullanilan Namespace icerisinde aranmaktadir, eger orada bulunmadiysa, global Namespace de aranir.

Mesela strlen adinda bir fonksiyonumuz varsa ama biz php nin bize sunmus oldugu strlen fonksiyonunu kullanmak istiyorsak ozaman basina bir \ koymamiz gerekiyor

PHP:
  1. echo \strlen("blabla");

son olarakda hangi namespace de oldugumuzu görmek icin _NAMESPACE_ Konstansini cagara bilirsiniz.

Categories: PHP

Tags: , Leave a comment

Comments Feed1 Comment

  1. Php 5.3 yenilikler, degisikliler vs. | Kadir Özdemir

    [...] – Düsen ve istenmeyen özellikler – Migrasyon sorunlari – yeni Fonksiyonlar – genisletilen Fonksiyonlar – Windows destegi – Namespace [...]

Leave a comment

You must be logged in to post a comment.

Feed

http://www.skorp.eu / Php 5.3 Namespace ler