PHP'de namespace kullanımı

Farklı modüllerde bulunan sınıf isimlerinin aynı olması durumunda çakışma meydana gelmesinden dolayı namespace ile sınıflara isimlendirmede detaya gidilmiştir. Böylece çakışmanın önüne geçilmiştir.

PHP?de namespace kullanımı

PHP dili bazı zaruri ihtiyaçlardan dolayı namespace özelliğine ihtiyaç duymuştur. Böylece 5.3 sürümü ile 2009 yılında PHP diline namespace özelliği gelmiştir. Aslında tam olarak dile girmesinin sebebi büyük projelerde farklı modüllerde bulunan sınıf isimlerinin aynı olması durumunda çakışma meydana gelmesinden dolayı namespace ile sınıflara isimlendirmede detaya gidilmiştir. Böylece çakışmanın önüne geçilmiştir.

Benzer özelliklere sahip sınıflar bir arada çağırıldığında isim karmaşası çıkabiliyor. Bazen de sınıfların hangi sınıfları içerdiği konusunda karmaşa yaşanabiliyor. Bu gibi karmaşaları önlemek için php ve diğer yazılım dillerinde namespace kullanılmaktadır. Bir diğer tanımlama ise sınıfların etki alanında diyebiliriz. Örneğin bir php dosyası içerisinde birden çok class mevcut, bu klaslara bir namespace ismi tanımladıktan sonra dosya içerisindeki klaslara erişiminiz daha kolay ve pratik olmakta. Dikkat edilmesi gereken husus namespace tanımlamasında php etiketlerin hemen ardından yazılması gerekiyor herhangi bir boşluk açıklama olmamalı.

Örneğin

Dosya ismi burhanmt.php olsun içerisinde şöyle bir sınf bulunsun:  

class datetimes {
       function topla($a,$b) {
            //kodlar..
       }
}

 

Şimdi bir dosyamız daha olsun adı utils.php olsun.

Onun içinde de:  

class datetimes {
       function topla($a,$b) {
            //kodlar..
       }
}

  yukarıdaki sınıf bulunsun. Dikkat ettiysek 2 dosyamızda da aynı ad altında (datetimes) adında sınıfımız var.

İşte bu iki dosyayı bir projeye include ile dahil edersek:

include ('utils.php'); //içerisinde datetimes adında bir sınıf var.
include ('burhanmt.php'); //içerisinde datetimes adında bir sınıf var.

İşte budurumda PHP hata verecek ve 2 sınıfın ismi tanımlanan projede aynı olamaz diyecek. Programın çalışmasına izin vermeyecek. Bu durum 3.parti componentleri çok sık kullanan kişilerde baş ağrısı yapmaya başlamıştı. O yüzden firmalar sınıf oluştururken kendi firma yada ürün isimleriyle isimlendiriyorlardı. Şöyle:  

class zend_dateutils {

}

  Şimdi PHP 5.3 ile bu duruma gerek kalmadı. Namespace özelliği geldi. Nasıl kullanıyoruz:

Dosya ismimiz yine burhanmt.php olsun.  

namespace burhanmt {

          class datetimes {
                // kodlar...
          }
}

 

  utils.php dosyasında da aşağıdaki gibi tanımlayalım.

namespace utility {

          class datetimes {
                 // kodlar...
          }
}

 

  Şimdi yukarıdaki sınıfı projemizde kullanmak için: 

include('burhanmt.php');
include('utils.php');

$date1= new burhanmtdatetimes(); // hatasız çalışacak
$date2= new utilitydatetimes(); // hatasız çalışacak

  yaparsak kodlarımız hata almadan çatır çatır çalışır.

 

Bir kullanımı daha var. O daha pratik ve güzel. Use reserved word ile kullanarak. Şöyle:  

include('burhanmt.php');
include('utils.php');

use burhanmtdatetimes;
use utilitydatetimes as mydate;

$date1= new datetimes(); // burhanmt.php içindeki burhanmt namespace adındaki datetimes'i kullanacak.
$date2= new mydate(); //  utils.php içindeki utility namespace altındaki datetimes'i kullacak ama datetimes adında değil de mydate adında.

 

  isimlendirme yaparken C# dilinde daha detaylandırma yapabiliyorduk şöye: 

namespace burhanmt.onemlidosyalar.tarih {
}

  aynısını php ile de yapabiliriz. Tek farkı nokta(.) yerine backslash kullanmak. Şöyle: 

namespace burhanmtonemlidosyalartarih {
}

  Şimdi önemli bir hadise daha var. Bundan muhakkak bahsetmeliyim. O da PHP içerisinde hazır olan global sınıflar var ve bu sınıfları kendi oluşturduğumuz sınıflar içerisinde kullanırken hata alabiliriz. Şöyle: 

namespace App;

class Product {
        public function show () {
               $datetime = new DateTime (); // Fatal error verecek. AppDatetime bulunamadı diyecek. Bunu aşmanın bir yolu var.
        }
}

  Bunu aşmanın yolu:  

namespace App;

class Product {
     public function show () {
            $datetime = new DateTime (); //  "" ifadesi ile onun global bir sınıf olduğunu belirtiyoruz.
      }
}


Örnek:

İstenirse namspace tanımlamalarında ön isimde kullanılabilir. Örnek bir tanımlama:

Aynı klasör içerisinde bir den çok namespace tanımlamasıda yapılabilmektedir. Bir namespace in bittiği yerde diğeri başlayacaktır. Örnek bir tanımlama:

Yine oluşturulan namespace ler use operatörü ile de çağırılabilmektedir. Use kullanımında namespace ismi belirtildikten sonra yine sınıfın adı da belirtilir. Dikkat edilmesi gereken yer sınıfın sonunda () operatörü bulunmamaktadır ve sınıf tekrardan çağırılmaktadır. Diğer bir husus ise namesapce, use ve class isimleri büyük küçük harfe duyarlıdır. Örnek bir tanımlama

Aynı sınıf isimlerinde karmaşayı engellemek için sınıflara as operatörü ile de takma isim verilmektedir. Tabi bu use operatörü ile çağırılıdığında kullanılmaktadır. Örnek bir tanımlama:

 

  Kaynak

 

Yorumunuzu Ekleyin
Yükleniyor...
Yükleniyor...