Burhan T. 3 dakikalık okuma
June 4, 2017

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

Ö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 burhanmt\datetimes();  // hatasız çalışacak
$date2=  new utility\datetimes();  // 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 burhanmt\datetimes;
use utility\datetimes 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.

namespace 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 burhanmt\onemlidosyalar\tarih 
{
}

Ş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. App\Datetime 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.

 }
}

Etiketler: