Yanıtlar:
Ad aralığı işlevler ve sınıflar için, kapsamın değişkenler için ne yaptığını yapar. Bir isim çarpışmasına neden olmadan aynı programın veya sınıf adını aynı programın farklı bölümlerinde kullanmanıza izin verir.
Basit bir ifadeyle, bir ad alanını kişinin soyadı olarak düşünün . "John" adında iki kişi varsa, soyadlarını kullanarak bunları ayırt edebilirsiniz.
Diyelim ki adlı bir işlev kullanan bir uygulama yazdınız output()
. Sizin output()
işlevi sayfanızda HTML kodu tüm alır ve kullanıcıya gönderir.
Daha sonra uygulamanız büyür ve yeni özellikler eklemek istersiniz. RSS yayınları oluşturmanıza izin veren bir kitaplık eklersiniz. Bu kütüphane ayrıca output()
son feed'in çıktısını almak için adlandırılmış bir fonksiyon kullanır .
Aradığınızda output()
, PHP işlevinizi mi output()
yoksa RSS kütüphanesinin output()
işlevini mi kullanacağını nasıl bilir ? Öyle değil. Ad alanları kullanmadığınız sürece .
İki output()
fonksiyona sahip olmayı nasıl çözeriz ? Basit. Her output()
işlevi kendi ad alanına yapıştırıyoruz .
Bu şöyle görünecektir:
namespace MyProject;
function output() {
# Output HTML page
echo 'HTML!';
}
namespace RSSLibrary;
function output(){
# Output RSS feed
echo 'RSS!';
}
Daha sonra farklı fonksiyonları kullanmak istediğimizde şunu kullanırdık:
\MyProject\output();
\RSSLibrary\output();
Ya da isim alanlarından birinde olduğumuzu ilan edebiliriz ve sonra sadece o isim alanının adını verebiliriz output()
:
namespace MyProject;
output(); # Output HTML page
\RSSLibrary\output();
Ad alanlarımız olmasaydı, bir kitaplık eklediğimizde veya potansiyel olarak işlev adlarımızı benzersiz kılmak için sıkıcı öneklerle geldiğimizde çok fazla kodu değiştirmeniz gerekirdi. İsim alanları ile, üçüncü taraf kodunu kendi projelerimizle karıştırırken çarpışma isimlendirmesinin baş ağrısından kaçınabiliriz.
Bir ad alanı, bir adın altına bir grup kod yerleştirmenize ve sınıflar, işlevler ve sabitlerle herhangi bir adlandırma çakışmasına sahip olmanıza izin vermez.
Kodunuzun bu ad alanında yaşamasını sağlar .
PHP, ad alanı düzeylerini göstermek için biraz tartışmalı karakter kullanır \
. İnsanlar silahlardan kalktı çünkü aynı zamanda bir kaçış karakteri olarak da kullanılıyor.
PHP'de ad alanını kullanmak için dosyanızın en üstünde böyle bir şey kullanın.
namespace my\namespace;
Ad alanları için resmi PHP belgeleri hakkında daha fazla bilgi bulabilirsiniz .
“İsim alanı” nı bilerek “kullanım” anahtar kelimesini öğrenmek daha kolay olduğundan, önce temel bir Laravel projesine bakarak ad alanını açıklayayım.
Adıyla bir kontrolör sınıfı vardır: Controller.php yolunda geçerli: app / HTTP / Kontrolörler projenin kök dizininde adında başka denetleyici sınıfı da vardır: Controller.php , ama bu bir yolda olduğunu: satıcı / laravel / framework / src / Illuminate / Projenin kök dizininden yönlendirme
Eğer php için yeniyseniz kaynak koduna bakmanız gerekmez, çünkü sizi şaşırtabilir, bunun yerine size önem verdiğimiz ve “isim alanı” ve “kullanımı ”.
Nitekim ilk denetleyici sınıfımız: app / Http / Denetleyiciler / Denetleyici.php , İkinci denetleyici sınıfı satıcısını / laravel / framework / src / Illuminate / Routing / Controller.php'yi kullanmalıdır . bazı önemli yönlendirme işlevlerini işlemek için içeriğine erişebilmek için bu Sınıfı genişletmesi gerekir.
Öyleyse bir sınıf aynı ada sahip başka bir sınıfı nasıl genişletebilir?
class Controller extends Controller
? bu iki sınıfı ayırt
etmenin bir yolu olmadığı sürece işe yaramayacaktır ve işte bu noktada kullanışlı olur ve anahtar kelime, (sınıflar; yöntemler; arabirimler ve sabitler), aynı adla, aynı kapsamda.namespace
use
şimdi kodda nasıl yapılır? Çok basit! biz bakarsak uygulama / HTTP / Kontrolörleri / Controller.php : kaynak kodu, biz olarak ilan edilir sınıfı ad üstündeki görebileceğiniznamespace App\Http\Controllers
bu artık diğer sınıfların tarafından başvurulan olabilir böylece sınıf bir ad vermek nasıl yani, bu, projenin kök dizininden bu sınıfa giden yolla aynı görünür, çok az fark vardır ve bu\
, “/
“ ( “
pencerelerde komut istemiyle aynı) ” yerine“”kullanımıdır, ancak başka bir fark daha vardır ve başkentteki uygulama budur Ad alanında 'A' ile 'küçük harf' a 'yolunda' app '. Ayrıca ad alanının büyük / küçük harfe duyarlı olduğunu unutmayın.
Bu nedenle ad alanı yoldan ayrı bir kavramdır, yardımcı olursa yol yapısını takip edebilir, ancak sınıfa, yönteme, arayüzlere veya sabitlere giden kesin yol olması gerekmez, örneğin: vendor / laravel / framework /src/Illuminate/Routing/Controller.php kaynak kodu,
sınıfın en üstünde ad alanının şu şekilde bildirildiğini görüyoruz: Illuminate\Routing
şimdi sınıfımızı sınıfımızda kullanmak istediğimiz belirli bir sınıf veya işlevden haberdar etmek için use
“ use
” anahtar kelimesine bakalım, “ ” anahtar kelimesini inceleyelim
yani sınıfımıza belirli bir sınıf veya yöntem kullanacağımızı bilmelerine izin verdiğimiz veya herhangi bir şeyi dahil etmiyoruz . Bunların ad alanlarına başvurarak app / Http / Controllers / Controller.php kaynak koduna bakalım. " use Illuminate\Routing\Controller as BaseController
" satırından , " use
" anahtar kelimesini ve ardından
hedef sınıf için ad alanını görebilirsiniz (.php uzantısı olmadan Illuminate \ Routing \ Controller.php ve Illuminate \ Routing \ Controller 'ifadelerinin birbirinin yerine kullanılabileceğini unutmayın)
belirli bir sınıf, yöntem, arayüz veya sabitlere app / Http / Controllers / Controller.php dosyasının Illuminate \ Routing \ Controller.php dosyasını BaseController olarak genişletmesine izin veren bir takma ad
vermek as
için “ use
” anahtar kelimesini “ ” anahtar kelimesiyle birlikte kullanabiliriz satır: “ ”.class Controller extends BaseController
Diğer programlama dillerinde ad alanları gibi teknikler vardır (Java'daki paketler gibi). Bir projede aynı isimde birden fazla sınıfta bulunabiliyorlardı.
Php dokümanlarından ( http://www.php.net/manual/en/language.namespaces.rationale.php ):
İsim alanları nelerdir? En geniş tanımda, ad alanları öğeleri kapsüllemenin bir yoludur. Bu birçok yerde soyut bir kavram olarak görülebilir. Örneğin, herhangi bir işletim sisteminde dizinler ilgili dosyaları gruplandırmaya yarar ve içindeki dosyalar için bir ad alanı görevi görür. Somut bir örnek olarak, foo.txt dosyası hem / home / greg hem de / home / other dizinlerinde bulunabilir, ancak foo.txt dosyasının iki kopyası aynı dizinde birlikte bulunamaz. Ayrıca, / home / greg dizininin dışındaki foo.txt dosyasına erişmek için, /home/greg/foo.txt dosyasını almak için dizin ayırıcıyı kullanarak dizin adını dosya adına yerleştirmeliyiz. Aynı prensip programlama dünyasındaki isim alanlarına da uzanır.
Dizinler ve dosyalar gibi PHP'deki ad alanı da sınıfları , işlevleri , arabirimleri ve sabitleri gruplamaya yarar .
Misal:
Filesystem | PHP Namespace
----------------|------------------
/Dir/File.txt | \Namespace\Class
Öğeleri genel alandan kaydırmanın bir yolunu sağlar ve bir programda ad çakışmasına neden olmadan düz öğe adının kullanılmasına izin verir. PHP 5.3.0, PHP 7'de desteklenmektedir.
Ancak PHP ad alanı ve Unix tabanlı dosya sistemi arasında benzerlik açısından bazı sınırlamalar vardır:
| Filesystem | PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive | No | Yes
--------------------------|-----------------------|-------------------------
Name with plain number | Yes | No
--------------------------|-----------------------|-------------------------
Path level | Yes | Yes
--------------------------|-----------------------|-------------------------
Plain metacharacters name | Yes | No
İlke, programlama sözcüğündeki ad alanına kadar uzanır.
Bir Ad Alanı dizin gibi çalışır. Üst (veya başka bir) dizindeki dosyalarla aynı adlara sahip bir dizine dosyaları nasıl koyabileceğinizi biliyor musunuz? Bir ad alanı bunu bir uygulama içinde değişkenler, işlevler ve sınıflar için yapmanıza izin verir.
PHP'de bir süre önce büyük statik işlev sınıfları için bir eğilim vardı. Bu işlevlerden herhangi birini çağırmanın tek yolu, çağrıyı sınıf adıyla öneklemektir. Bu, ad alanlarındaki ilkel bir girişimdi, ancak pek fazla faydası yoktu.
Bir ad alanı temel olarak kodu bir kaba koymanıza izin verir. Bu, aynı adı paylaşan iki işlev (sınıflar ve değişkenlerin yanı sıra) ile ilgili sorunları önleyecektir.
Bunlar, aynı adla paylaşan kod parçalarıyla ilgili sorunları önlemek için daha büyük uygulamalarda çalışırken yararlıdır.
Örneğin, "TheMessage" adlı iki fonksiyon istediğimizi varsayalım. Her ikisi de her biri farklı mesajlar basar (yankılar). Normalde, aynı adı paylaşan iki işleviniz olmadığından sözdizimi hatasına neden olur.
Bunu düzeltmek için, bu işlevleri ayrı ad alanlarına koyabilirsiniz. Bu, her iki işlevi de hatasız kullanmanızı sağlar.
Ad alanı birçok şeyi tek bir pakette paketlemek gibidir. Bir ad alanını, her türlü şeyi koyabileceğiniz bir çekmece olarak düşünün: bir kalem, bir cetvel, bir kağıt parçası vb. Birbirlerinin eşyalarını kullanmaktan kaçınmak için, çekmeceleri etiketlemeye karar verirsiniz, böylece kime ait olduğu açıktır.
Ad alanı, kod çakışması olmadan farklı yerlerde kullanılabilmeleri için kapalı kod grubuna kullanılır. Bunu jQuery çakışma yöntemi olarak düşünün ve daha iyi anlayacaksınız.
Ad alanı, bir programdaki adları denetlemek için kullanılan basit bir sistemdir.
İsimlerin benzersiz olmasını ve herhangi bir çatışmaya yol açmamasını sağlar.
Oluşturduğunuz kod ile dahili PHP sınıfları / işlevleri / sabitleri veya üçüncü taraf sınıfları / işlevleri / sabitleri arasında ad çakışmalarını önlemek için ad alanını kullanabilirsiniz. Ad alanları ayrıca, ilk sorunu azaltmak ve kaynak kodunun okunabilirliğini artırmak için tasarlanan Extra_Long_Names'i takma (veya kısaltma) özelliğine de sahiptir.
Hepimizin bildiği gibi, PHP'de ad alanları ve özellikler yeni değil, ancak birçok php geliştiricisi karmaşıklıkları nedeniyle bu Büyük kavramları kullanmıyor. Yani, bu yazıda. Onları örneklerle temizlemeye çalışacağım. Ad alanı ve özellikler nelerdir?
Kodunuzu yeniden kullanılabilir ve genişletilebilir hale getirmek için bunları kodunuza nasıl uygulayabilirsiniz?
İsim alanlarının faydaları
Oluşturduğunuz kod ile dahili PHP sınıfları / işlevleri / sabitleri veya üçüncü taraf sınıfları / işlevleri / sabitleri arasında ad çakışmalarını önlemek için ad alanını kullanabilirsiniz.
Ad alanları ayrıca, ilk sorunu azaltmak ve kaynak kodunun okunabilirliğini artırmak için tasarlanan Extra_Long_Names'i takma (veya kısaltma) özelliğine de sahiptir. Bir örnekle isim alanlarını anlayalım. htdocs (xampp) veya www (xwamp) klasöründe “php_oops” adlı bir klasör oluşturun “namespaces” adlı kök dizinin altında yeni bir klasör oluşturun ve ardından namespaces klasörü altında bir index.php dosyası oluşturun.
<?php
// FilePath:- namespaces/index.php
// let's say, we have two classes in index,
// here, these two classes have global space
class A
{
function __construct()
{
echo "I am at Global space, Class A";
}
}
class B
{
function __construct()
{
echo "I am at Global space, Class B";
}
}
// now create an object of class and
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output:
I am at Global space, Class A
I am at Global space, Class B
Referans- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb