PHP Namespace Kullanımı
Hepinize merhaba dostlarım 😊. Bu yazımda sizlere diğer programlama dillerinde olduğu gibi PHP programlama dili üzerinde de olan, özellikle büyük projelerde sıklıkla karşımıza çıkan, işlerimizi oldukça kolaylaştıran bir yapıdan yani namespace (İsim Alanları) konusundan bahsedeceğim. Özellikle framework kullanan dostlarım varsa aranızda namespace ifadesini dosyalar üzerinde sıklıkla görmüştür. Bilmeyen dostlarım için ise ufak bir mantıksal tanımlama yapayım
NAMESPACE NEDİR ve NE ZAMAN KULLANILIR ?
Eveeeet dostlarım 😊. Namespace nedir ve ne zaman kullanılır başlığımıza gelmiş bulunmaktayız 😊. Yukarıda da değindiğim gibi namespace ifadeleri OOP (Object Oriented Programming) ile gelmiş olup projemizde isim alanı oluşturmamıza yardımcı olur ve bize son derece kolaylık sağlar 😊. Bunun bize sağladığı fayda nedir diye soracak olursanız hemen size konuyu anlatayım dostlarım 😊
Öncelikle bir proje oluşturdunuz diyelim. İki ayrı dosyamız var ve bu dosyalarımızda oluştuduğumuz class isimleri de aynı varsayalım. Bu iki dosyadaki bu aynı isme sahip iki class yapısını tek bir dosyamıza dahil edip (include) kullanacağız varsayalım. Hemen aklınıza şu soru geldi sezdim 😊
Hocam aynı isimde değişken tanımlarken nasıl hata alıyorsak aynı isme sahip iki class ı kullanmaya çalıştığımızda da hata almaz mıyız ?
Helal olsun size dostlarım cidden helal olsun 😊. Çok güzel bir mantık kurdunuz ve oluşacak hatayı daha ekrana bastırılmadan sezdiniz tebrik ederim 😊. Dediğiniz gibi çalışmaz hata verdirir ve ekranda der ki "Kardeşim aynı isme sahip iki class var birinin ismini sana zahmet değiştiriver 😊" şeklinde ekranımıza bir çıktı yapılır 😊. Biz de bu ismi değiştirmek istemiyorsak yani class isimlerini değiştirmek istemiyorsak (büyük projeler örneğin) namespace yapısını kullanarak farklı farklı sayfalarda aynı isimde birden fazla class oluşturup tek bir dosyamıza dahil ederek sorunsuz bir şekilde kullanabiliriz 😊
Şimdiiii gelelim artık nerelerde kullanıldığına 😊. Özellikle devasa projelerde (E-Ticaret uygulaması olabilir, Sosyal medya platformu gibi vs olabilir) ve ekip sayısı yüksek olan projelerde aynı isimde birden fazla class olabilir. Örnek veriyorum a.php dosyasındaki Urunler class ı ürün ekleme silme güncelleme yaparken b.php dosyasındaki Urunler class ı gelen ürün hakkında cari sorgulama işlemleri yapsın varsayalım. Bunu farklı isimde yapıp namespace kullanmadığımızı bir düşünsenize 😊. Uzun bir kontrol süreci bizi bekliyor olacaktır 😊. Acaba bu class nereden geliyor ne işlem yaptırıyoruz diye 😊. İşte dostlarım namespace nedir ve ne zaman kullanılır konusu bu kadar 😊.
NAMESPACE KULLANMADAN İKİ AYNI CLASS KULLANMA
Yukarıdaki tahmin ettiğiniz hata mesajını bir de yakından görelim istedim dostlarım 😊. Normalde dediğimiz gibi iki aynı class kullanılamaz hata verir 😊. Ama bu hatayı da görmmemiz bizim konuyu tam anlamıyla anlamamızda yardımcı olur 😊. Şimdi gelelim bir laptop.php dosyası oluşturalım ve içerisine
<?php
class Fare{
}
class Klavye{
}
şeklinde iki aynı class yazalım 😊. Daha sonra masaustu.php dosyamızı oluşturalım ve bunun da içerisine
<?php
class Fare{
}
class Klavye{
}
şeklinde kodlarımızı yazalım 😊. Yani iki dosyamıza da aynı isimde classları verdik 😊. Daha sonrasında da index.php isimli dosyamızı oluşturalım ve içerisine
include 'laptop.php';
include 'masaustu.php';
new Fare();
şeklinde kodlarımızı yazalım 😊. Daha sonra bu kodlarımızı browser sayfasında çalıştırmaya çalıştığımızda ekranımıza
Cannot declare class Fare, because the name is already in use
şeklinde bir sonuç çıkacaktır. Yani diyor ki "Dostum Fare isminde iki adet class var benim kafam karıştı hangisini çalıştırcam 😊. Birini çalıştırsam ötekinin boynu bükük kalacak" şeklinde karşımıza çıktı veriyor. İşte dostlarım bu noktada bize yardıma koşan tek şey namespace oluyor 😊. Hemen namespace nasıl oluşturulur ona bakalım 😊
NAMESPACE OLUŞTURMA
Artık yukarıdaki örneklerde yaptığımız iki aynı class ı tek bir sayfada kullanmamızda yardımcı olan namespace konumuza geldik dostlarım 😊. Ama öncelikle bu namespace oluşturmayı kavramamız lazım. Çünkü belli bir kuralı var 😊. Örnek vermemiz gerekirse laptop.php dosyamızın içerisinde mesela
<?php
class Fare{
}
class Klavye{
}
namespace Laptop;
şeklinde kodumuzu yazarken özellikle phpstorm kullanıyorsanız
şeklinde altını kırmızı bir şekilde çizecektir. Yani namespace global bir yapı olduğu için bunu dosyamızın en üzerinde tanımlamamız lazımdır. Yani kodumuzu gelip
<?php
namespace Laptop;
class Fare{
}
class Klavye{
}
şeklinde düzeltmemiz lazımdır 😊. İşte ilk namespace yapımızı oluşturduk dostlarım 😊. İşlemimiz bu kadar basit.
NAMESPACE YAPISINI KULLANMA
Artık projemiz oluşturduğumuz laptop.php dosyamızda namespace tanımladığımıza göre sıra geldi bunun kullanım aşamasına dostlarım 😊. Ama öncelikle masaustu.php dosyamızda da ufak ayarlama yapıp o şekilde kullanalım diyorum. Hemen hızlıca masaustu.php dosyamıza gelip
<?php
namespace Masaustu;
class Fare{
}
class Klavye{
}
şeklinde kodlarımızı yazalım 😊. Daha sonrasında index.php dosyamıza gelip
<?php
include 'laptop.php';
include 'masaustu.php';
$laptop = new \Laptop\Fare();
$masaustu = new \Masaustu\Fare();
şeklinde kodlarımızı rahatlıkla yazabiliriz dostlarım 😊. Yalnız burada biraz görüntü kirliliği gibi bir şey oluştu dostlarım 😊. Bunu siz umarım benden önce fark etmişsinizdir. Ve aklınıza gelen soru şudur ki ben sezdim taa buradan 😊.
Hocam konu çok güzel Allah razı olsun güzel anlatıyorsunuz ama bu yukarıdaki kısımda \Laptop\Fare() veya \Masaustu\Fare() şeklinde biraz görünüm açısından pek uymadı gibi 😊 Normalde bu şekilde kullanımı yaygın mı yani hep böyle mi kullanacağız ?
şeklinde sorularınızın olduğunu seziyorum dostlarım 😊. Bu şekilde tam best practice bir yol olmaz ama kullanılır mı derseniz evet kullanılır 😊. Biz namespace işleminde bunun daha güzel kullanımını göreceğiz 😊. O halde vakit kaybetmeden bunun kullanımına geçelim
USE KULLANIMI
Üstteki konuda bahsettiğimiz yani \Laptop\Fare() şeklinde uzun uzun slash ile belirtmeden kullanmanın tek bir yöntemi var mı diye soruyorsanız dostlarım "Evet Var 😊". Olarak cevap verebilirim. Kullanım kısmında hiçbir zorluk yok tamamen basit ve anlaşılır şekilde kullanımıyla kodlarımızı rahatlıkla çalıştırabiliriz dostlarım 😊. Sözümüzü daha fazla uzatmadan hemen kullanım kısmına geçelim lakin ilk olarak use komutu ile farklı class ları kullanacağım
<?php
include 'laptop.php';
include 'masaustu.php';
use Laptop\Fare; // laptop.php içerisindeki Fare class ını kullan dedik
use Masaustu\Klavye; // masaustu.php içerisindeki Klavye class ını kullan dedik
$laptop_fare = new Fare();
$masaustu_klavye = new Klavye();
şeklinde iki ayrı class ı kullanıp uzun uzun slash ( \ ) kullanımından kurtulduk dostlarım 😊. Şimdi gelelim aynı isimdeki class ları kullanım nasıl oluyor ona bir göz atalım
<?php
include_once 'laptop.php';
include_once 'masaustu.php';
use Laptop\Fare;
use Masaustu\Fare;
şeklinde kodlarımızı yazdık. Ama bize bu hata verir. Hatada ise şu şekilde çıktı oluşur
Cannot use Masaustu\Fare as Fare because the name is already in use
Burada hata mesajı bize diyor ki dostlarım "Fare class ı kullanımda 😊. Sen bunu tekrar kullanamazsın" şeklinde bir uyarı veriliyor 😊. Bu hataya da erişmeden yani phpstorm kullanıyorsanız hemen altını aşağıdaki resimdeki gibi çizecektir
şeklinde bize kırmızı bir şekilde altını çizdi dostlarım 😊. Burada diyor ki "Dostum Fare isminde iki adet class çağırıyorsun anlaşılan ben bunu kullanamam 😊 Sadece takma isim kullanarak çağırabilirsin" şeklinde bir uyarı veriyor bize 😊. Şimdi aklınızdaki soru şu olmuştur
Hocam peki bu takma isim tanımlama şekli çok uzun bir işlem mi ? Bunu nasıl yapacağız ?
Dostlarım o kadar basit bir işlem ki görünce bu muydu diyeceksiniz 😊. Hiçbir karmaşa gerektirmiyor 😊. Hemen kodlama kısmımıza gelip
<?php
include 'laptop.php';
include 'masaustu.php';
use Laptop\Fare;
use Masaustu\Fare as MasaustuFare;
$laptop_fare = new Fare();
$masaustu_Fare = new MasaustuFare();
şeklinde kodlarımızı rahatlıkla yazabiliriz 😊. Bütün işlemler bu kadar basit dostlarım 😊. Artık bu kısma kadar her şey tamam ise dostlarım gelin sizinle bir örnek yapalım. Daha önceki okumuş olduğum iki ayrı kitap üzerinden (Tarihi, Mizah türünden) iki kitap üzerinden örnek vereceğim 😊. Öncelikle tarih.php isimli bir dosya oluşturalım ve içerisine
<?php
namespace tarih;
class Kitap{
public function isim(){
echo "Buhara Yanıyor - Yavuz BAHADIROĞLU";
}
}
şeklinde kodlarımızı yazalım 😊. Daha sonrasında ise mizah.php isimli bir dosya açalım ve içerisine
<?php
namespace mizah;
class Kitap{
public function isim(){
echo "Türkleri Anlama Kılavuzu - Zeki Kayahan COŞKUN";
}
}
şeklinde kodlarımızı yazalım 😊. Daha sonra bir index.php dosyası oluşturalım ve içerisine
<?php
include "tarih.php";
include "mizah.php";
use tarih\Kitap;
use mizah\Kitap as MizahKitap; // Kitap isminde tekrardan class kullanamadığı için takma isim verdik
$tarih = new Kitap();
$mizah = new MizahKitap();
echo $tarih->isim()."<br>";
$mizah->isim();
şeklinde kodlarımızı yazalım 😊. Sonrasında ise kodlarımızı browser üzerinde çalıştıralım dostlarım 😊. Gelen sonuca baktığımızda
Buhara Yanıyor - Yavuz BAHADIROĞLU
Türkleri Anlama Kılavuzu - Zeki Kayahan COŞKUN
şeklinde kodlarımızın çıktısı başarılı bir şekilde verildi dostlarım 😊. Yani buradan anlayacağımız şey kodlarımız sorunsuz bir şekilde çalışıyor 💯.
Eveeeet dostlarım 😊. Bu yazımda sizlere PHP programlama dili üzerinde tıpkı OOP (Object Oriented Programming) gibi bir ihtiyaçtan doğan Namespace nedir ? Ne durumlarda kullanılır, oluşturulması nasıldır gibi konulardan elimden geldiğince dilim döndüğünce anlatmaya çalıştım 😊. Umarım faydalı olmuşumdur 😊. Eksik veya hatalı bir bilgi aktarımı yapmışsam benimle iletişime geçmekten çekinmeyin dostlarım 😊. Konu başlarda biraz karmaşık ve zor gelmiştir dostlarım anlıyorum. Öğrenme süreci her zaman sancılı olur. Bu süreçte sizlerden tek isteğim "İstikrarlı ve Azimli Olmanız, Bolca Pratik Yapmanız 😊". Bu dediklerimi hayat felsefeniz yaptığınız sürece başarı sizler için kaçınılmaz olacaktır 😊.
Hayallerinizi gerçekleştirmeniz ve güzel yerlere gelmeniz dileklerimle... İyi çalışmalar dilerim 😊
Yazar Hakkında
Kendi Halinde Bir Backend Developer