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.
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:
function topla($a,$b) {
//kodlar..
}
}
Şimdi bir dosyamız daha olsun adı utils.php olsun.
Onun içinde de:
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:
}
Şimdi PHP 5.3 ile bu duruma gerek kalmadı. Namespace özelliği geldi. Nasıl kullanıyoruz:
Dosya ismimiz yine burhanmt.php olsun.
class datetimes {
// kodlar...
}
}
utils.php dosyasında da aşağıdaki gibi tanımlayalım.
class datetimes {
// kodlar...
}
}
Şimdi yukarıdaki sınıfı projemizde kullanmak için:
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('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:
}
aynısını php ile de yapabiliriz. Tek farkı nokta(.) yerine backslash kullanmak. Şöyle:
}
Ş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:
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:
class Product {
public function show () {
$datetime = new DateTime (); // "" ifadesi ile onun global bir sınıf olduğunu belirtiyoruz.
}
}
Örnek:
//yeni bir namespace ismi tanımladık.
class testClass{
//bir class oluşturduk.
public function yaz($metin){
//bir metot oluşturduk.
echo $metin;
}
}
$sinif=new caglarhocatestClass();
$sinif->yaz("Çağlar hoca ile php dersleri.");
İstenirse namspace tanımlamalarında ön isimde kullanılabilir. Örnek bir tanımlama:
//yeni bir namespace ismi tanımladık.
class testClass{
//bir class oluşturduk.
public function yaz($metin){
//bir metot oluşturduk.
echo $metin;
}
}
$sinif=new caglarhocaveritabanitestClass();
$sinif->yaz("Çağlar hoca ile php dersleri.");
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:
//yeni bir namespace ismi tanımladık.
class testClass{
//bir class oluşturduk.
public function info(){
//bir metot oluşturduk.
echo "siniflarclass_1 testClass";
}
}
namespace siniflarclass_2;
//yeni bir namespace ismi tanımladık.
class testClass{
//bir class oluşturduk.
public function info(){
//bir metot oluşturduk.
echo "siniflarclass_2 testClass";
}
}
$sinif=new siniflarclass_2testClass();
$sinif->info();
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
//yeni bir namespace ismi tanımladık.
class testClass{
//bir class oluşturduk.
public function info(){
//bir metot oluşturduk.
echo "siniflarclass_1 testClass";
}
}
use siniflarclass_1testClass;
$sinif=new testClass();
$sinif->info();
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:
//yeni bir namespace ismi tanımladık.
class testClass{
//bir class oluşturduk.
public function info(){
//bir metot oluşturduk.
echo "siniflarclass_1 testClass";
}
}
namespace siniflarclass_2;
//yeni bir namespace ismi tanımladık.
class testClass{
//bir class oluşturduk.
public function info(){
//bir metot oluşturduk.
echo "siniflarclass_2 testClass";
}
}
use siniflarclass_1testClass as sinif_1;
use siniflarclass_2testClass as sinif_2;
$sinif1=new sinif_1();
$sinif1->info();
echo "<hr />";
$sinif2=new sinif_2();
$sinif2->info();
Kaynak
- https://burhantanis.com/blog_kod_dunyam/2017/06/04/phpde-namespace-kullanimi
- https://caglarbostanci.com.tr/php-oop-namespace-kullanimi/