“Kendi düşen ağlamaz ama kardeşi düşen ağlar. ”
Çünkü merhametin çaresizliğe tahammülü yoktur. Ve “kardeş” öyle bir olgudur ki bu ne kan bağı ne de başka birşey ile ifade edilebilir. Ve insanlıktan yoksun üveyler sizi! Biz hiç kardeş olamayacağız ve siz hiç ağlamayacaksınız.
Hepinizde verecek bir cevabım var. Ama biliyorum ki sizin de cevaplarınız tıpkı benimkiler gibi pratik ve kendi doğrularınız olacak. Sonuç olarak 2 tane doğruyu ayrı ayrı savunmuş olacağız. Bu doğruları ne zaman birleştirebiliriz bilmiyorum. Ama canı acımayan insandan vicdanının sızlamasını bekleyemem. Bu yüzden hadi canı acıyan o insanlara vicdanlarımızı gönderelim. Onlar sözlerimize, dilimize, dinimize, ırkımıza dokunmadan vicdanlarımızı kabul edeceklerdir. Belki orada buluşabiliriz.
Frameworkler birer birer Namespace yapısına geçmeye başladı. Bu da konunun daha çok konuşulmasına ve soruların artmasına neden oldu. Şu adresteki soruları incelemenizi istiyeceğim ( php namespaces at stackoverflow ) 188 çok değil ama zamanım oldukça oradaki soruları da analiz etmeye çalışacağım.
Namespace, bilindiği üzere birçok dilde zaten kullanılan bir yöntem, ve bana göre kütüphanelerin birleştirilmesi / farklı geliştiricilerin oyuna dahil olması anlamında çok gerekli bir özellik. Kısaca neden kullanırız? Bize ne sağlar? Ve buna PHP tarafından bakarsak, nasıl kullanırız? Nelere dikkat etmemiz gerekir bunları yazmaya çalışacağım. Sadece yazılımsal (syntactic) olarak değil, anlamsal olarak da (semantic) bize sağlayacağı kolaylık ve zorluklardan bahsetmek istiyorum.
Hiç namespaces hakkında bilginiz olmadığını düşünerek şöyle somutlaştırmak istiyorum, Tufan diye bir arkadaşınız olduğunu düşün, arkadaşlar arasında bahsederken Tufan onu tanımlar, ve yeni bir Tufan arkadaşınız olunca artık “hangi Tufan?” soruları başlar öncelikle. Problem burda başlar ve siz buna bir çözüm bulursunuz, “Yıldırım Tufan” evet. Çözdünüz. Yazılımda bu problemin çözümü de Namespace ile gelmiş oluyor. Hangi PDF sınıfı? Zend\Pdf sınıfı.
Artık teknik olarak devam edelim,
Namespace Tanımlama:
0 1 2 3 4 5 6 7 8 | <?php namespace Uygulamam { /** * Standart olarak bu parantezler arasına yazılacak herşey "Uygulama" içine dahil olacaktır. * çağırılırken bu alanda değilsek \Uygulama\ önadını kullanacağız. */ } ?> |
Alternatif bir yazım şekli olarak parantezleri kullanmama özgürlüğmüz de var
0 1 2 3 4 5 6 | <?php namespace Uygulamam /** * Standart olarak bu satırdan sonra yazılacak herşey "Uygulama" içine dahil olacaktır. */ ?> |
İç içe namespace tanımlamak istediğimizde de “\” ters slash kullanabiliriz, kısaca ornek verelim, namespace, fonksiyonları ve classları özelleştirmemizi sağladığı gibi, namespaceleri de bir namespace dahil ederek özelleştirebiliriz gayet basit.
0 1 2 | <?php namespace Uygulamam\Mobil\Android; ?> |
Normal şartlarda, her namespace için bir dosya kullanmamız önerilir, fakat siz tek dosyada birden fazla namespace kullanmak istiyorsanız, bunların birbirilerini nasıl etkileyeceğini bilmelisiniz, “Mobil” namespace için tek dosya kullanmak istiyorsak örnek verelim
Bir dosyada birden fazla namespace tanımlarken, parantez kullanımına dikkat etmeliyiz, parantez kullanıyorsak bu namespace içine bir namepsace tanımlanamaz yani kısaca “namespace Uygulama { namespace Mobil { } }“ gibi bir yazım hata sebebedir.
ve aynı dosyada herhangi bir namespace ait kodlar da bulunamaz. Örneği vermeden önce de şunu söylemek gerekiyor ki; alt namespaceler tanımlarken sahip namespace (örn : Uygulama) nin tanımlanmış olmasına gerek yok. Yani biz Uygulama diye bir namespace tanımlamadan Uygulama\Mobil ya da Uygulama\Mobil\Android diye namespace tanımlayabiliriz.
Örnek :
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?php //library.php olsun. namespace Uygulamam\Mobil\Android { class View { public function view() { print 'I will include a view file for ' . __NAMESPACE__; } } } namespace Uygulamam\Mobil\IPhone { class View { public function view() { print 'I will include a view file for ' . __NAMESPACE__; } } } namespace Uygulamam\Mobil { $b = new Android\View(); $b->view(); } ?> |
Örneği çalıştırmanızı rica ediyorum, ve tek dosyada incelemek istediğimiz için böyle bir yazım yaptık, şimdi analiz edelim,
Uygulamam\Mobil\Android ve Uygulamam\Mobil\IPhone alanlarına aynı isimde, aynı medodlara sahip “View” adında bir class tanımladık, kullanım kısmındaki ayrıntıyı da gösterebilmek için son namespacei “Uygulamam\Mobil” olarak tanımladım, böyle tanımlamak zorunda mıyız? tabi ki hayır, bu namespace içine yazacağımız ve çağıracağımız herşey Uygulamam\Mobil namespace içine dahil olacaktır. Önce kendimizi bir Namespace içine dahil ettik, sınrasında yazdığımız “new Android\View()“ terimi başında “\” olmadığı için dahil olduğumuz namespace içindeki “Andorid” anlamına geldi yani ” \Uygulamam\Mobil\Android“ oldu çıktıyı da incelersek
“I will include a view file for Uygulamam\Mobil\Android” Şimdi yeri gelmişken __NAMESPACE__ sabitini de inceleyelim. Tahmin edebileceğiniz gibi bulunduğumuz namespacei tespit etmemizi sağlayan bir sabit (her namespace için değişiyorsa bu nasıl sabittir ?) sihirli sabitler diye türkçeye çevirebileceğimiz “Magic Constatns” konusunu inceleyebilirsiniz,
“Use”
Karmaşık ve iç içe çok namespace içeren projelerimizde, uzun isimler olacaktır Örnek : “namespace Uygulamam\Mobil\Android\WebServices\NuSoap” bu alanlar içindeki sınıf ve fonksiyonlara ulaşmak istediğimizde, bu pathı tekrar tekrar yazmak elbette hoşumuza gitmeyecektir, namespace bir zorluk olaacaktır. “use” keywordu bize bu sınıflara o blok içinde kısa isimler vermemiz konusunda yardımcı olacak. Önceki dosyamızın adı “library.php” olsun ve bahsettiğimiz namespacei içine 2 sınıfla beraber tanımlayalım.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php // libraray.php'nin devamı namespace Uygulamam\Mobil\Android\WebServices\NuSoap { class Users { public function getUsers() { return array('User 1','User 2'); } } class Posts { public function getPosts($userId) { return array('Post 1','Post2 2'); } } } ?> |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php /** * Bu uzun ismi her sınıf için tekrar yazmamak için bir alias tanımadık. * artık kısaca Webservice\Users gibi ulaşabiliriz */ use \Uygulamam\Mobil\Android\WebServices\NuSoap as WebService; include 'library.php'; $usersService = new WebService\Users(); $postService = new WebService\Posts(); $users = $usersService->getUsers(); var_dump($users); //output /** I will include a view file for Uygulamam\Mobil\Android array(2) { [0]=> string(6) "User 1" [1]=> string(6) "User 2" } */ ?> |
“use ” kullanabilmek için bu namespacein tanımlanmış olmasına gerek yok, bu yüzden okunabilirlik için “use” bloklarını hep en üstte tutmaya çalışın. Sadece çağrılınca bunun varlığı kontrol edilir. biz de zaten sonrasında include “library.php” diyerek tanımlamış olduk.
yani şu iki satırın anlamı kısaca şöyledir.
0 1 | $usersService = new WebService\Users(); // new \Uygulamam\Mobil\Android\WebServices\NuSoap\Users(); $postService = new WebService\Posts(); // new \Uygulamam\Mobil\Android\WebServices\NuSoap\Posts(); |
Örnek Dosyalar: http://www.tufyta.com/wp-content/uploads/2011/10/php-namespaces.zip
– buraya trickler, hatalara sebep olabilecek kullanımlar vs. gelecek –
Not: Lütfen, eklemek, düzeltmek, sadeleştirmek istediğiniz şeyler varsa, yorum / mail olarak atabilirsiniz, “PHP Namespaces” için kapsamlı bir döküman oluşması konusunda yardımcı olan herkese şimdiden teşekkür ediyorum.
sayılara takılıyorsunuz ya hani o sayılar kadar şerefiniz kalmaz! kalmamış da.
kaç gramdır o yürek?
canınıza tak etmesi için size koca bir sayı mı lazım? hazırlıyorum onu size rahat olun.
“Kaç damla gözyaşı?”
Bir anne feryadının sizi etkileyebilmesi için kaç damla gözyaşı dökmesi gerekiyor? Bana ciğerinin kaç damla göz yaşı edeceğini söyle , ciğerini gözyaşlarıyla yakayım! Ha bi de aramızda 3ün 5in lafı olmaz açık söyle gözünü sevim.
“Ne kadar yetecek?”
Sor bugün ağlayana, onlar için “kadar” kelimesinin bir anlamı yok artık. Çünkü duyguların zaman ve birim kavramı yoktur! “Ne zaman” sorusu için de çok geç kaldın dostum “Barış Hemen Şimdi!” diyor anne ben anlıyorum dilinden bak tercüme ettim.
“Kına-yın”
Biyerlerinize yakın. Başardınız. Siz “ölü sayısı” ile ölçülebilen bir vicdana sahip olduğunuzdan emin ettiniz bizi!
Umutlar da bitti, bitti tükendi, tükettiniz.
“Edi Bese!”
Bunun hangi lisanda söylendiği önemli değil, ama hangi dilde söylendiği çok önemli. Anne dili bunu söylüyorsa birşeyler ifade etmeli “Edi Bese!”
“İntikam”
Bir şehit annesinin “Edi Bese” lafının çağrışımlarından sonra bir siyasiden duyduğumuz “Yeter Artık” lafının çağrıştırdıkları ne kadar farklı. Ne kadar acı değil mi?
İntikamlar hep intikamla mı? …. (Error :too many recursion). Kodunuz bozuksa evet!







