İsim alanları nelerdir?


241

PHP Ad Alanları nedir?

Genel olarak İsim Alanları nelerdir?

Bir örnek ile Layman cevabı harika olurdu.

Yanıtlar:


573

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.

Senaryo

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 .

Misal

İ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 Alanı Yok mu?

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.


Nedense dosya1'de ad boşluklarını kullanırsanız, dosya2'ye dosya eklemek veya eklemek zorunda kalmayacağınızı düşündüm. Birim testleri durumun böyle olmadığını göstermiştir.
Aaron Bell

1
Sen kontrol etmek isteyebilirsiniz @AaronBell Özdevinimli .
cbednarski

21

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 .


11

“İ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.namespaceuse

ş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\Controllersbu 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 useuse” 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 asiçin “ use” anahtar kelimesini “ ” anahtar kelimesiyle birlikte kullanabiliriz satır: “ ”.class Controller extends BaseController


9

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.


1
Java ile karşılaştırmak kötü bir fikirdir. Java'nın paketleri vardır ve paket görünürlük sınıfları vardır. Korunan üyelerin görünürlüğü, erişen pakete de bağlıdır.
Artefacto

1
Paketlere eşit değiller ama aynı fikri paylaşıyorlar.
2ndkauboy

Soru genel olarak hangi ad alanlarının da olduğunu sorduğundan, cevap mantıklıdır.
kiamlaluno

@kiam Tek bir fikri paylaşırlar - çatışmasız sınıf isimleri. Görünürlük fikrini paylaşmazlar.
Artefacto

@Artefacto: Kau-Boy, her iki dilde de ad alanlarının aynı olduğunu söylemedi.
kiamlaluno

4

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.


3

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.


2

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.


2

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.


0

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.


"JQuery no çakışma yöntemi" ile ne demek istiyorsun? Bu PHP ile nasıl ilişkilidir?
Nico Haase

0

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.


Hangi tür "isimler" den bahsediyorsunuz?
Nico Haase

0

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


1
Lütfen farklı sitelerde kendi içeriğinizle bağlantı oluşturmaya dikkat edin, spam gönderen olmak istemezsiniz . İçeriğin çoğunu buraya dahil etmeli ve bağlantıyı yalnızca referans olarak kullanmalısınız.
Dharman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.