PHP NameSpace - nasıl hazırlanır? PHP Ad Alanları Açıklamalı Test ve Çoklu Tasarım

  • 07.03.2024

PHP, 5.3 sürümünden itibaren bize ad alanlarını verdi. O zamandan bu yana, bu ad alanının nasıl kullanılacağına ilişkin bazı durgun ve hararetli tartışmalar oldu.
Symphony, Laravel ve elbette Zend gibi bazı çerçeveler bu teknolojiyi benimsemiştir.
Bütün bunlar aşağı yukarı MVC şemasına uyuyor. Muhtemelen sonsuz bir tartışma var: Uygulamanın ana evlilik çifti ne olmalı - Model ve Denetleyici?
Bazıları bize Modelin şişman ve şişman olması gerektiğini ve onunla birlikte ince ve zayıf bir Kontrolör olması gerektiğini söylüyor. Tek kelimeyle - anaerkillik.
Diğerleri ise tam tersine, Kontrolörün her şeyi yönetmesi ve komuta etmesi gerektiğine inanıyor, bu yüzden onun sağlam ve iyi beslenmiş olduğu ortaya çıkıyor. Ve yanında, görevi vermek ve getirmek olan ince, narin bir Model var. Bu ataerkilliktir.
Peki MVC şemasında hangisi daha iyi? Ataerkillik mi, anaerkillik mi?
Gelin buna demokrasiye dayalı bir aile birimi inşa etme perspektifinden bakalım. Bırakın Namespace bu konuda bize yardımcı olsun.

Dikkatsiz olduğunuzda porselen dükkanındaki boğa gibi tüm uygulamayı ezebilecek kalın, hantal Kontrolörleri sevmiyoruz.
Biz de şişman modelleri sevmiyoruz. Peki onları kim seviyor? Podyuma layık olmalılar!
İyi bir çöpçatan gibi Namespace'in yardımıyla uyumlu bir aile yaratmaya çalışalım.

Öncelikle uygulama çerçevesini oluşturalım. Ne kadar sıradan olursa olsun, bırakın bir blog olsun.

Aşağıdakileri içeren temel bir yapı oluşturduk:

  • Blog, uygulamamızın deposudur;
  • Görünümler ve Şablonlar - görünümlerin ve şablonların depolanması;
  • Yardımcı Program - paylaşılan kitaplıkların deposu;
  • index.php - önyükleme komut dosyası;
  • Post - Kontrolörün ve Modelin aile cennetinin gerçekleşmesi gereken yer burasıdır.

index.php ile her şey basittir:

koşmak(); /* * index.php'nin sonu */

Gerekli yolları belirliyoruz ve bir otomatik yükleyici oluşturuyoruz.
Otomatik yükleyici, sınıf ad alanına göre bir klasör hiyerarşisinde bulunan gerekli sınıfları yükler. Örneğin, BlogPostServicesView sınıfı Blog/Post/Services'te aranacaktır.
Ve işte Namespace ile ilk buluşmamız.
İndex.php'yi başlattığımızda, sınıfı Blog/Blog.php'den yüklenen Blog uygulamasının bir örneğini oluştururuz.
Ona bakalım.

gönderi = yeni Gönderi(); ) public function run() ( $this->post->view->all(); ) )//end class Blog

Blog sınıfını oluştururken, içine Namespace BlogPost ile bir Post sınıfı enjekte ediyoruz ve otomatik yükleyici bunu Blog/Post/Post.php'den yüklüyor.
Muhtemelen bu sınıfa Kontrolör adı verilebilir,

görünüm = yeni Görünüm(); )) )//sınıf sonu Gönderi

Gönderi varlığı şunları içerir:
- veri kaydının yapısı - BlogPostEntitiesPostEntity.php

Denetleyici isteklerini sunan hizmetler - BlogPostServicesView.php (örneğin hizmetlerden biri)

db = yeni DB(); )//end __construct public function all() ( $posts = $this->db->anket(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "footer",), array("posts" => $posts, "title" => "Viper sitesi",)); ) )//end class PostView

Veritabanı etkileşim sistemi - BlogPostRepositoriesDB.php - işte burada, ince, zarif Modelimiz,
Sadece ver, getir ve daha fazlası değil!

dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ) catch (PDOException $e) ( echo "Hata!: " . $e->getMessage() . "
"; die(); ) )//end __construct public function Survey() ( $query_view = $this->dbh->prepare("SELECT * from posts"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//anketi sonlandır )//db sınıfını sonlandır

Sonuç olarak, tüm bileşenlerin iyi bir şekilde birbirine bağlandığı, aynı zamanda her sınıfın kendi görevini gerçekleştirdiği, net bir sınıf ayrımı elde ettiğimiz bir uygulama yapısı oluşturmayı başardık. Kontrolörümüz ince ve aynı zamanda güçlüdür. Model ona uyuyor. Mükemmel aile!
Ve hepsi Namespace'e teşekkürler.

Çoğu durumda çerçevenin uygun olduğunu tartışmıyorum. Ama bakın, Namespace size hiçbir şey hatırlatmıyor mu?
Tamamen geliştiriciye bağlı, sınıflara açık bir bölünme, katı ve aynı zamanda esnek bir dizin ve sınıf hiyerarşisi.
Bazen çerçeve biçiminde yüzlerce dosya ve sınıf şeklinde bu kadar önemli bir eklenti bulunmaz.
Sınıfların ve bileşenlerin etkileşimi için Procrustean kurallar yatağının yokluğu.

Makale, Laravel çerçevesinin yazarı Taylor Otwell'in bu konudaki düşüncelerinden ilham almıştır ve kendisine çok teşekkür etmektedir.
GitHub'daki örnek kaynak kodunun adresi.

Merhaba. Bugünkü yazımızda şunları inceleyeceğiz: PHP'deki ad alanları nelerdir?.

Uzun süredir kullanıyorsanız OOP, o zaman muhtemelen üçüncü taraf bir kütüphaneye bağlanırken, kodunuzda zaten kütüphanedekiyle aynı sınıf adlarını kullanmanız nedeniyle bir başarısızlıkla karşılaştığınız bir durumla karşılaşmışsınızdır. Bu, özellikle aşağıdaki gibi yaygın adlar kullanıyorsanız meydana gelebilir: "model", "db" ve benzeri. Şimdi size bunu nasıl düzelteceğinizi anlatacağım.

Ad alanı- bu, benzersiz tanımlayıcıların (isimlerin) soyut gruplandırılması için oluşturulmuş bir tür depolama alanıdır.

Onlar. Eğer kullanırsan ad alanları, o zaman üçüncü taraf kütüphaneleri güvenli bir şekilde bağlayabilir ve bunların kodunuzdakiyle aynı adlara sahip olacağından korkmazsınız. Teoriyi bitirip pratiğe geçelim.

Bir dosya oluşturalım sınıfım.php bu içerikle

namespace my\oneProject;
sınıfım Sınıfım ( )
?>

Burada ad alanında bir sınıf oluşturduk benim\oneProjem. Bu arada, ters eğik çizgiyi tam olarak yazmanız gerekiyor. Kafanız karışmasın!

Şimdi dosyada index.phpşunları yazalım

require_once("sınıfım.php");
$mc = new Sınıfım(); // Hata: sınıf bulunamadı
$mc = new benim\birProjem\Sınıfım(); // her şey çalışıyor
?>

Gördüğünüz gibi artık bu şekilde bir sınıf oluşturmak mümkün değil, hangi sınıfta olduğunu belirtmeniz gerekiyor. ad alanı yatıyor.

Aynı anda birkaç tane belirtebiliriz ad alanları tek bir dosyada

ad alanı Projesi;

Sabit CONNECT_OK = 1;
sınıf Bağlantı ( )
işlev bağlantısı() ( )

NamespaceBaşkaProje;

Sabit CONNECT_OK = 1;
sınıf Bağlantı ( )
işlev bağlantısı() ( )
?>

Sınıf, fonksiyon ve sabit isimlerinin tamamen aynı olmasına rağmen isim çatışması yaşamayacağız çünkü farklı alanlarda yatıyorlar.

Ayrıca parantez sözdizimini de kullanabiliriz.

ad alanı Projesi (

Sabit CONNECT_OK = 1;
sınıf Bağlantı ( )
işlev bağlantısı() ( )
}

Ad Alanı AnotherProject (

Sabit CONNECT_OK = 1;
sınıf Bağlantı ( )
işlev bağlantısı() ( )
}
?>

Kodu birleştirirseniz küresel ad alanı diğer alanlarda kod varsa yalnızca parantezli sözdizimi kullanılır.

ad alanı Projesi (

Sabit CONNECT_OK = 1;
sınıf Bağlantı ( )
işlev bağlantısı() ( )
}

Ad alanı ( // genel kod
oturum_başlangıç();
$a = Proje\bağlantı();
echo Proje\Bağlantı::start();
}
?>

Ayrıca, bir ad alanı tanımlamanın her zaman kodun ilk satırı olması gerektiğini unutmayın. Böyle yazarsan hata olur

Şu anda hangi ad alanında olduğunuzu bulmak için sabiti kullanabilirsiniz. __NAMESPACE__

ad alanı Projesi;
echo """, __NAMESPACE__, """; // "Proje" yazdırılacak
?>

Bu sabiti kullanarak örneğin dinamik olarak adlar oluşturabilirsiniz.

ad alanı Projesi;

İşlev dahil($sınıfadı) (
$a = __NAMESPACE__ . "\\" . $sınıf adı;
yeni $a'yı döndür;
}
?>

Bugünlük bu kadar. Kursu alarak daha fazla bilgi ve pratik bilgi edinebilirsiniz.

Yakın zamanda projemi bir ad alanına yerleştirdim ve uygun dokümantasyon eksikliği sorunuyla karşılaştım. Bulmayı başardığımız her şeyin tarihi yaklaşık 2009'a kadar uzanıyor ve neredeyse 2012... Bulunan materyalde, php'nin güncel sürümünde olmayan bir şeyi kullanan birçok çalışmayan yer var. Bu bağlamda bu konuya biraz ışık tutmak istiyorum.
Peki Ad Alanı veya Ad Alanı nedir? Büyük Wikipedia onları şu şekilde tanımlıyor:

Ad alanı, benzersiz tanımlayıcıların (yani adların) mantıksal gruplandırılması için oluşturulan bir model, soyut depolama veya ortam anlamına gelen bir kümedir. Bir ad alanında tanımlanan bir tanımlayıcı, o ad alanıyla ilişkilendirilir. Aynı tanımlayıcı birden fazla alanda bağımsız olarak tanımlanabilir. Dolayısıyla, bir ad alanında tanımlanan bir tanımlayıcıyla ilişkili bir değer, başka bir ad alanında tanımlanan aynı tanımlayıcıyla aynı (veya daha doğrusu farklı) anlama sahip olabilir (veya olmayabilir). Ad alanına duyarlı diller, bir tanımlayıcının hangi ad alanına ait olduğunu (yani tanımını) belirten kuralları tanımlar.wiki

Temiz? Aslında çok basit. Sürüm 5.3'ten önce, php'de yalnızca iki boşluk vardı - global (ana kodunuzun yürütüldüğü yer) ve yerel (işlev değişkenlerinin tanımlandığı yer).

Sürüm 5.3'ten bu yana her şey değişti. Artık sınıflarınızın, yöntemlerinizin vb. bulunacağı ad alanınızı tanımlayabilirsiniz.


Umarım biraz daha net olmuştur.

Özellikle sınıflara aynı adı verdim. Farklı uzaylarda tanımlandıkları için aynı isimlere rağmen iki farklı sınıftırlar. Ana komut dosyası hala küresel alanda çalışıyor, burada hiçbir şey değişmedi ve sınıflar ve işlevler hala burada tanımlanabiliyor. Peki o zaman boşluklar ne işe yarar? Her şeyden önce, bir çerçeveye veya kitaplığa sahip bir dosya eklediğinizde, sınıflarınızın çerçevenin sınıflarını geçersiz kılmayacağından veya bunun tersini yapmayacağından emin olmak için.

Ad alanınızda tanımlı sınıfları kullanabilmek için tanımladığınız alanı doğru yerde global olana aktarmanız gerekir (Ben genellikle bunu dosyanın başında yapmayı tercih ederim).Bunu yapmak için use anahtar sözcüğünü kullanın.

Dikkat: bazı nedenlerden dolayı php anahtar kelimenin kullanımına izin vermiyor kullanmak durum blokları ve döngüler

Resimlerdeki örneği alıp kodda uygulayalım:

Dikkat: ad alanı anahtar sözcüğü dosyanın en başında, hemen sonra yer almalıdır
A.php dosyası
B.php dosyası
Alternatif bir sözdizimi mümkündür:
Her ad alanının ayrı bir dosyada bildirilmesi önerilir. Bir tanesinde mümkün olsa da kesinlikle önerilmez!
Şimdi ana scriptimizin çalışacağı üçüncü dosyaya geçelim.
index.php
Görünüşe göre bu bir avantaj, sadece daha fazla kod ekleniyor, ancak bu tamamen doğru değil, biraz daha ileride dosyaları sınıflara bağlayan satırların gereksiz olacağı bir otomatik yükleme sınıfı örneği vereceğim.
Şimdi derslerimize bakalım.

Dikkat: php ad alanlarında kapsam çözümleme operatörünü (::) kullanma izin verilmedi! Uygun olduğu tek şey statik sınıf yöntemlerine ve sabitlerine erişimdir. İlk başta bunu isim alanı için kullanmak istediler ancak daha sonra ortaya çıkan sorunlar nedeniyle buna karşı çıktılar. Bu nedenle A::A::say(); gibi bir yapı geçersizdir ve hataya neden olur.

Ad alanları için "\" ters eğik çizgi karakterini kullanmalısınız
Dikkat: Yanlış anlaşılmaları önlemek için, dizelerde kullanıldığında bu karakterden kaçınmak gerekir: "\\"

Ad alanları birbirinin içine yerleştirilebilir, hadi A.php dosyamıza ekleyelim:
ve dizine aşağıdakileri yazacağız:

Önemli bir nokta, içe aktarılan alanlar için takma adların kullanılmasıdır. A\subA::say(); yazabilirsiniz. Her seferinde boşluklara tam yol yazmanın zor olduğunu kabul edeceksiniz; bunu önlemek için takma adlar eklendi. Derleme sırasında aşağıdakiler gerçekleşecektir: alt takma adı yerine A\subA kullanılacaktır, böylece A\subA::say(); çağrısını alacağız;

Peki küresel alanda tanımlanan işlevler çağrıldığında ne olur? PHP öncelikle şu anda çalışmakta olduğunuz alanda bir işlev arar ve bulamazsa global kapsama gider. Genel bir işlev kullandığınızı hemen belirtmek için, önüne ters eğik çizgi koymalısınız.

Sınıfların alanlardan otomatik olarak yüklenmesiyle ilgili sorunları önlemek için dosya sisteminin, alanların organizasyonuna benzer şekilde düzenlenmesi gerekir. Örneğin sınıflarımızın saklanacağı bir kök klasör sınıflarımız var, ardından alanlarımız aşağıdaki gibi düzenlenebilir
sınıflar\A\A.php
class\A\sub\A.php (alt alt uzay ayrı bir dosyaya yerleştirilecektir)
sınıflar\B\B.php

PHP'de geçerli alanın adını içeren __NAMESPACE__ sihirli sabiti vardır.

Ve şimdi otomatik yükleme hakkında.

Aşağıdaki sınıf benim değil, sadece çalıştırdım ve biraz geliştirdim, buradan aldım.
Dikkat: Sınıflarınızın yüklenebilmesi için sınıf adının dosya adıyla eşleşmesi gerekir!

" .$dosya ." in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closedir($handle); ) ) özel statik fonksiyon StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $dosya = fopen($dir, "a"); akın($dosya, LOCK_EX); fwrite($dosya, ("║" .$veri ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flok($dosya, LOCK_UN); fclose ($dosya); ) ) \spl_autoload_register("adınızAlanı\Autoloader::autoload"); )
Yükleme için gelen sınıfların adlarına bakarsanız, her sınıfın başına kullanımda belirtilen ad alanından bir önek geldiğini göreceksiniz. Bu nedenle, ad alanına benzer dizinlerdeki dosyaların konumunu kullanmanızı öneririm; bu, aramayı bir veya iki yinelemeye kadar hızlandırır.

Artık indeksimiz şu şekilde yazılabilir:
Artık kullanacağınız tüm sınıflar ve arayüzler otomatik olarak yüklenecektir.

Dilin bazı dinamik yeteneklerini boşluklarla göstermek için başka bir sınıf tanımlayalım:
test.php

Index.php
sayName("test"); //veya bu testi yapabilirsiniz\sayName("test2"); //veya bunun gibi $obj::sayName("test"); //veya bu testi yapabilirsiniz::sayName("test2");

Umarım makalem birilerine faydalı olur.

Bir değişken bir değeri tanımlar ancak başka bir değişkene referans olabilir ve onun değerine sahip olabilir. Bir algoritmanın yürütülmesi sırasında bir değişken genellikle birçok farklı değer alır. Bir sabit yalnızca bir değeri saklar. Bir nesne öngörülemez: yapıya, içeriğe ve birçok özelliğe sahip olma eğilimindedir.

Ad alanı, geliştirici tarafından oluşturulan ve bu ad alanının adı aracılığıyla başvurulabilecek değişkenler, sabitler, nesneler, işlevler ve diğer yapılardan oluşan bir koleksiyondur.

İsimler: veri ve algoritmaların tanım alanı

Öğelerin adları (değişkenler, sabitler, nesneler, işlevler ve diğer geliştirici yapıları) asla kesişmez. PHP, herhangi bir ad eşleşmesini ciddi bir hata olarak yorumlar ve sorunu açıkça tanımlayamadığı durumlarda geliştirici, amaçlandığı gibi çalışmayan bir kod veya tarayıcıda beyaz bir kutu alır.

Alan global olduğundan tüm verilerin tüm adlarının benzersiz olması gerekir. Nesnelerin ve işlevlerin adları da tekrarlanmamalıdır, ancak nesnelerin ve işlevlerin yöntem gövdelerinde küresel görünürlük kapsamı kesintiye uğrar. Kendi yerel ad alanına sahiptir ve hiçbir şey, bir şeyi harici olarak adlandırıldığı gibi dahili olarak adlandırmanızı engellemez.

Yukarıdaki örnek bir klasiktir, eğer ad alanı anahtar kelimesine dikkat etmezseniz: her şey her zamanki gibi. İkincisi ise eserleri içerir. İşlev adlarından önceki NameSpaceTwo\ öneki, kodun hangi ekten alındığını belirtir.

İlk fonksiyondan global anahtar kelimeyi ve işlemi kaldırırsak $iExt = 1; Yukarıdaki satıra giderseniz, ne birinci ne de ikinci fonksiyon 100 değişkeninin değeri hakkında bilgi sahibi olmayacaktır.

Ad alanları: Çoklu açıklama kapsamları

Gösterilen örnekte iki ek kullanan paylaşılan bir dosya bulunmaktadır. Her ekleme aynı scCheckName() işlevine sahiptir. Hangisinin seçileceğine programcı tarafından ilgili alanın adının doğru zamanda kodda doğru yerde kullanılmasıyla karar verilir.

Ortak kodda aynı ismin mevcut olması (eklemelerin birleştirilmesinden sonra), her ekleme dosyasının kendi benzersiz adıyla işaretlenmesi gibi basit bir nedenden dolayı hataya neden olmaz.

İlk dosyada, içinde anlatılacak olan her şey NameSpaceOne adıyla ilişkilendirilmiştir. İkinci dosyada tüm açıklamalar NameSpaceTwo adıyla ilişkilendirilecektir.

Her iki dosyada da adların çoğaltılmasına izin verilir, ancak her birinde herhangi bir öğe adı (değişken, sabit, nesne, işlev) benzersiz olmalıdır.

Bu örnekte, scCheckName() işlev çağrısında ad alanı adının değiştirilmesi, ikinci ad alanının $iExt değişkeninin değiştirilmesini engelledi. Bu nedenle örnekte "değişti" kelimesi özel olarak vurgulanmıştır; değişiklik gerçekte gerçekleşmemiştir. Değişkenin değeri aynı kalır.

Test ve Çoklu Tasarım

Bu basit örnekler, karmaşık projelerin geliştirilmesini kolaylıkla basitleştirebileceğinizi, verimliliği, üretkenliği artırabileceğinizi ve işi hızlandırabileceğinizi göstermektedir. Kesinlikle ad alanlarının kullanımına ilişkin ilk fikirler hemen ortaya çıktı:

  • komut dosyalarının güvenli testi - "çalışma" alanlarını test analoglarıyla değiştirerek;
  • Büyük geliştirici ekipleri tarafından güvenli tasarım - onlara öğeleri tanımlamak için "bireysel" alanlar sağlayarak.

Aslında ad alanı çok daha önemlidir. PHP dili, ad alanı ve açıklamanın her bir öğesi (değişken, sabit, nesne...) uzun süredir geliştiriciye sözdizimi ve anlambilimi bağımsız olarak yönetme yeteneği sağlamıştır.

Dil yapıları ve modern programlamanın genel kuralı: "anlaşıldı" - uygulandı - bir çelişki var - "beyaz ekranın" profesyonel bir geliştirici üzerinde hiçbir etkisi yok.

Çoğu programcı, tarayıcıda hiçbir şey olmadığında (boş bir beyaz kutu) PHP hata mesajını nerede arayacağını bile bilmiyor. Gelişiminin belirli bir aşamasında, bir programcı PHP sözdizimi ve anlambilimiyle düşünür, otomatik olarak "çalışır" ve sonuç: izin verilen sınırlar dahilinde kendi sözdizimi ve kendi anlambilimidir.

Beyaz ekran, profesyonel bir programcının anında ve net bir tepkisidir ve hata ortadan kaldırılır. Neden hata ayıklayıcıyla ve hata günlüğünü inceleyerek zaman kaybedesiniz ki?

Nesneler, Diziler ve Ad Alanları

Değişkenlerin, sabitlerin ve fonksiyonların geçmişte kaldığını söyleyebiliriz ama nesne tasarımında kullanılıyorlar. İyi kod, algoritmanın bir dizi doğru yapıyla değil, etkileşimli nesnelerle temsil edilmesidir.

Nesne dizileri kullanırsanız, bir yığın fikrini ve dizinin son (ilk) öğesini değiştirirseniz, dinamikler elde edebilirsiniz: mevcut duruma bağlı olarak sitenin işlevselliğinin nasıl çalışması gerektiğine nesnelerin kendisi "karar verir" .

PHP'de ad alanı, genellikle karmaşık olan, kendi benzersiz adıyla temsil edilen özel bir değişken türüdür. Ad alanı adı kodda kullanılır. Bu bir dize ise, komut dosyası yürütülürken bir alanı diğeriyle değiştirebilirsiniz.

Eğer PHP değişken değerleri olarak ad alanı adlarını kullanıyorsa, bu, anlamsal olarak daha yüklü bir sözdizimidir ve nesne dizilerinden bile daha güçlüdür.

Nesne, birlik ile karakterize edilen bir yapı ve içeriktir. Ad alanı bir dizi nesne, öğe ve bunlar arasındaki ilişkilerdir.

Çalışan bir sistem üzerinde deneyler yapmak mümkün değildir, ancak ad alanı sayesinde PHP, aşağıdaki amaçlarla gerçek çalışan bir sistemi farklı bir alanda simüle etme yeteneği sağlar:

  • Daha fazla gelişme;
  • test yapmak;
  • bakım vb.

PHP geliştiricileri tarafından önerilen sözdiziminden soyutlarsak ve ad alanlarını küresel karmaşık nesne sistemleri olarak hayal edersek, olasılıkların ufku defalarca genişler.

Ad alanı sözdizimi ve kullanımı

PHP her dosyada yalnızca kodun ilk satırındaki ad alanı sözcüğünü kabul eder. Tüm açıklamalar yalnızca buna uygun olmalıdır. Sözdizimi yalnızca adın olağan anlamında belirtilen adı içerir.

Anlamı aktaran doğru kelimeleri kullanmak önemlidir. Adın uzun olması daha iyidir ancak hangi alandan bahsettiğimizi, ne yaptığını, neyi tanımladığını, neyi kabul ettiğini veya ne için yaratıldığını net bir şekilde anlayan bir şeyler içerir.

Alanlar süresiz olarak iç içe yerleştirilebilir ancak bu aşırı kullanılmamalıdır. Adın açık olması, iç içe geçmenin gerekçelendirilmesi ve alan adlarının sırasının mantıklı olması gerekir.

Kullanım ve ad alanı uygulamalarında PHP karmaşık kodlamaya izin verir, ancak mümkün olduğunda basit seçeneği tercih etmek daha iyidir.

Genel kural şudur: ad alanı bir açıklamadır ve bu bir dosyadır, kullanım, alanı kullanım komut dosyasına aktarmak ve ona bir takma ad (kısa bağlantı) atamaktır.

Sınıfların (nesnelerin) otomatik yüklenmesine ilişkin basit bir örnek

Görev, dizeleri işlemek için bir nesne, sayfa öğesi stilleri (CSS açıklamaları), bir tarih nesnesi, bir dosya sistemi nesnesi ve bir veritabanı nesnesi içerir. Uygulamanın amacı, gerekli yetenekleri yalnızca bu nesnelerin yöntemleri aracılığıyla kullanmak amacıyla bu beş konum için basit arayüzler oluşturmaktır.

Dil işlevlerinin ve yapılarının doğrudan kullanımına izin verilmez. Bu görev PHP sınıfının otomatik yüklemesini kullanır. Ad alanı, dosya sisteminde belirli bir konumda bulunan nesnelerin koleksiyonu olarak kabul edilir. Tipik olarak, tüm nesneler dosya sisteminde anlamlarına göre, klasörlerde ve belirli bir ada sahip dosyalarda bulunur.

Soldaki kod gerekli beş nesnenin oluşturulduğunu gösterir ancak tam olarak nerede bulundukları belirtilmez. Sağdaki kod, sınıfları (nesneleri) yüklerken, nesnenin konumu ve .php dosya uzantısının gerekli yolunu otomatik olarak değiştiren otomatik yükleyicinin (ana komut dosyası) metnini gösterir.

Birden çok ad alanı örneği

PhpOffice/PhpWord kütüphanesi, birden çok ad alanından oluşan karmaşık bir hiyerarşinin kullanılmasına iyi bir örnektir. Elementler klasörü, bir *.docx belgesi (MS Word) oluştururken kullanılabilen neredeyse tüm elementleri içerir; diğer klasörler, elementler, paragraflar ve tablolarla çalışmak için gerekli araçları içerir.

Aslında kütüphane, PhpOffice / PhpWord işlevsellik alanının belirli araçlarla desteklenmesi ve sonuçta benzer bir ürünün kendi versiyonunu oluşturması gerektiği için proje klasörüne yerleştirildi.

Farklı ad alanlarının birçok sınıfını yükleme

Birçok sınıfın yüklenmesi gerektiğinde ve geliştirilen nesne sisteminin hiyerarşisinin oldukça karmaşık ve hayal edilmesi zor olduğu durumlarda PHP ad alanı otomatik yüklemesini kullanmak, katı yapılar oluşturma ihtiyacını doğurur.

Geliştiricinin (çalışmaya devam etmek için ürünü kullanan) yönelimi, yalnızca nesnelerin gerçek anlamını ve ilişkilerini yansıtan uygun sözcük kombinasyonlarıyla temsil edilen anlambilim (projenin anlaşılması) bağlamında mümkündür.

Kütüphaneyi bireysel bir projede kullanma ihtiyacı, geliştirici ve PhpOffice / PhpWord yazar ad alanlarının nasıl birleştirileceği sorununun çözülmesine yol açar. En iyi yol, bu ürünü (mekanlarını ve nesnelerini) kendi proje alanına yerleştirmektir.

Bu ürünün ad alanlarını soyut öğeler ve sınıf yükleme düzeyinde değiştirmeden yapmanın mümkün olmayacağını unutmamak önemlidir. Bu, PHP ad alanında dahili ad alanlarının kullanımının yeterince soyut ve evrensel olmayabileceğini gösterir.

Dosya sistemi ve alan yerelleştirmesi

Temel olarak ad alanları, dosya sistemindeki istenen nesneye giden yolun "ana hatlarını çizer". Dosya adlarının nesne adı olarak kullanılması doğal ve yaygındır. Klasör adlarını ad alanı adlandırma olarak kullanmak objektiftir.

Bilginin "ahşap" organizasyonunun kullanımı oldukça hantaldır ve geliştirmeyi karmaşıklaştırır, ancak nesne sistemleri için doğal bir temsildir.

Sorun, geliştirme aşamasının, hem klasörlerin görünür temsilini hem de belirli bir klasörün içeriğini birleştiren özel bir kod düzenleyici tarafından temsil edilmesidir, ancak henüz nesneler arasında uçtan uca hareket sağlayacak bir düzenleyicinin bulunmamasıdır. klasörler.

Soyutlama ve evrensellik sorunu

Geliştiricinin bilinci ve gerçekte amacı tarafından kabul edilenler:

  • soyutlama ve bilgiyi gerçek semantiğine göre işleme yeteneği sağlar;
  • Ad alanları komut dosyalarının, nesnelerin konumunu ve kısmen projenin dosya sistemindeki anlamını yansıtır

Aslında, OOP soyutlamasını nesne adlarına (dosyalara) bağlayarak ve bunu yeterli ad alanı oluşumuyla (yollar + adlar) dosya sistemi (klasörler) üzerine yerleştirerek, komut dosyası yürütme sırasında ad alanlarının oluşumunu kontrol edebilirsiniz.

Programlama zaten güçlü bir geliştirme dinamiği kazanmıştır, ancak geliştirme aşamasının sürecini ve yükünü bir metin düzenleyiciden (komut dosyalarının oluşturulduğu ve klasör ağaçlarına yerleştirildiği) bir kod oluşturma fikrine aktarırsak kendisinin iyileştirilmesine ve dosya sisteminde doğru yere yerleştirilmesine izin verir - programlama yeni boyutlara ulaşacaktır.

  • Tercüme
  • öğretici
Not: Çeviri sırasında PHP'nin güncel sürümünün 5.5 olduğunu ve ayrıca bilge bir kılavuz kitabının da bulunduğunu biliyorum. Ancak yazarın ad alanı işlevselliğini nasıl sunduğunu ilginç buldum.Belki de makale, temelleri yeni öğrenen bazı kişilere yardımcı olabilir (ve yalnızca diğerlerine değil, PHP 5.2'ye yerleşmiş birçok sakallı geliştirici var). Hodor.

PHP'de 5.3 sürümünden itibaren ad alanları ortaya çıktı. Çoğu modern dil uzun zamandır bu işlevselliğe sahipti, ancak PHP biraz geç kaldı. Ancak her yeni özelliğin bir amacı vardır, gelin ad alanını kullanarak nasıl fayda sağlayabileceğimizi öğrenelim.

PHP'de aynı isimli iki sınıfa sahip olamazsınız, hepsinin benzersiz olması gerekir. Bu sınırlamayla ilgili sorun, başka birinin User adında bir sınıf sağlayan üçüncü taraf kitaplığını kullanıyorsanız, User adında kendi sınıfınızı da oluşturamamanızdır. Bu gerçekten kötü çünkü Kullanıcı bir sınıf için çok uygun bir isim, değil mi?

Ad alanları bu sorunu çözmemize olanak tanır ve ihtiyaç duyduğumuz kadar Kullanıcı sınıfı oluşturabiliriz. Ad alanları aynı zamanda kodumuzu uygun paketler halinde düzenlememize ve bu kodun sahibi olduğumuzu belirtmemize de olanak tanır.

Çok yaygın bir sınıfa bakalım. Evet... Bunları zaten kullandığınızı biliyorum, ad alanlarının bununla ne alakası var? Bu konuda bana güven, tamam mı?

Küresel ad alanı

İşte çok basit bir sınıf:
Gördüğünüz gibi özel bir şey yok ve kullanmak istiyorsanız şunu yapın:
Dale, PHP'yi biraz biliyorum...

Tamam, tamam, özür dilerim. Mesele şu ki, bu sınıfın global isim alanında olduğunu düşünebiliriz.Bunun doğru terim olduğundan tam olarak emin değilim ama bana oldukça uygun geliyor. Aslında bu, sınıfın herhangi bir pakete ait olmadığı, sadece sıradan bir sınıf olduğu anlamına gelir.

Ad alanlarının kolay kullanımı

Küresel Eddard'ın yanına başka bir Eddard yaratalım.
Burada küçük bir değişiklikle, ad alanı direktifinin eklenmesiyle çok benzer bir sınıfa sahibiz. Dize ad alanı Stark; PHP'ye Stark ad alanında çalıştığımızı ve herhangi bir kodun (sınıfları, işlevleri, değişkenleri vb. bildirmek) ona başvuracağını söyler.

Dolayısıyla, eğer bunun şu şekilde yapılması gerektiğine karar verirseniz, yeni bir Edd oluşturmamız gerekiyor:
Yani hayır, bu doğru değil. Burada daha önce oluşturduğumuz ilk örnekten sınıfın bir örneğini alıyoruz. Stark ad alanındaki değil. Eddard Stark'ın bir örneğini oluşturmaya çalışalım.
Bir sınıfın örneğini oluşturmak için, sınıf adının önüne, sınıfın ait olduğu ad alanından bir önek koymamız ve sınırlayıcı olarak kullanmamız gerekir. ters eğik çizgi. Sonuç olarak, tam olarak ihtiyacımız olan sınıfın bir örneğine sahibiz. Büyülü değil mi?

Bu arada, ad alanları gerektiği kadar seviye kullanarak keyfi olarak karmaşık bir hiyerarşi oluşturabilir. Örneğin:
Bu\Ad Alanı\Ve\Sınıf\Kombinasyon\Aptalca\Fakat\Çalışıyor

Görecelilik teorisi

Size PHP'nin her zaman geçerli ad alanına göre çalıştığını söylediğimi hatırlayın. Gelin buna uygulamalı olarak bir göz atalım:
Bir ad alanı yönergesi ekleyerek PHP'ye Stark ad alanında olduğumuzu bildiririz. Eddard sınıfını tanımladığımız şey bu olduğundan, elde edeceğimiz şey tam olarak budur. Bakın - her şey görecelidir.

Artık ad alanını değiştirdiğimize göre küçük bir sorunumuz var. Neden bahsettiğim hakkında bir fikrin var mı? Şimdi orijinal Eddard sınıfımızı nasıl elde ederiz? Peki, küresel uzaydaki mi?

Neyse ki PHP'nin bu sorunu çözmemize olanak tanıyan bir hilesi var - yalnızca sınıf adına \ ekleyerek.
Baştaki eğik çizgiyi gören PHP, mevcut ad alanının ötesine bakmamız gerektiğini anlar ve ihtiyacımız olan sınıfın bir örneğini oluşturur.

Şimdi hayal gücünüzü kullanın. Tully\Edmure adında farklı bir ad alanından bir sınıfımız olduğunu hayal edin. Şimdi onu Stark uzayında kullanmamız gerekiyor. Peki bunu nasıl yaparız?

Bir kez daha, sınıfı Tully uzayında somutlaştırmadan önce küreselleşmek için ters eğik çizgi kullanmak zorunda kaldık.

Genel olarak, bunun gibi diğer ad alanlarındaki sınıflara atıfta bulunmak, addaki tam hiyerarşiyi kullanmak oldukça sıkıcı olabilir. Ama neyse ki kısayol yapma seçeneği var, gelin bir göz atalım:

Use yönergesini kullanarak farklı bir ad alanından bir sınıf alabiliriz. Lütfen bana "neden buraya eğik çizgi koymadık?" diye sormayın çünkü bilmiyorum. Bildiğim kadarıyla bu tek istisnadır. Hayır, burada eğik çizgi kullanabilirsiniz. ama bunun hiçbir anlamı olmayacak.

Ah, küçük bir numara daha! İçe aktarılan sınıflarımıza takma adlar verebiliriz:
As anahtar sözcüğünü kullanarak, Tully/Brynden sınıfına Blackfish takma adını verdik; bu, onu mevcut ad alanında tanımlamak için yeni takma adı kullanmamıza olanak tanır. Akıllıca değil mi? Bu, aynı ad alanı içinde aynı adlı iki sınıfı kullanmanız gerektiğinde de çok kullanışlıdır:

Dothraki uzayındaki Daenerys'e Khaleesi takma adını vererek Daenerys'in her iki sınıfını da kullanabiliriz. Oldukça kullanışlı, orada gerekli tüm sınıfları uygulamamızda kullanabiliriz.

Yapı

Ad alanları aynı zamanda kodumuzu düzenlememize de yardımcı olabilir. Göstereyim.

Diyelim ki açık kaynaklı bir kütüphane oluşturmak istiyorum. Başkaları kodumu kullanabilirse çok sevinirim, bu harika olur! Sorun şu ki kodumdaki sınıf adları kullanıcının kütüphanemdeki kendi uygulamasıyla çakışıyor. Bu son derece sakıncalı olurdu. Bu sorunu şu şekilde çözerdim:
Dayle\Blog\İçerik\Post Dayle\Blog\İçerik\Sayfa Dayle\Blog\Etiket
Burada kodun bana ait olduğunu göstermek ve kodumu kütüphanemin kullanıcı kodundan ayırmak için adımı kullandım. Temel ad alanı içinde hiyerarşilerine göre bir sınıf yapısı oluşturdum.

Composer'ı kullanmaya başladığınızda, kodun otomatik olarak yüklenmesini kolaylaştırmak için ad alanlarını nasıl kullanacağınızı öğreneceksiniz. Bu kullanışlı mekanizmaya bir göz atmanızı şiddetle tavsiye ederim.

Kusurlar

Gerçeği söylemek gerekirse, bu alt başlığı "Dezavantajlar" olarak adlandırdığım için kendimi biraz suçlu hissediyorum. Bahsetmek üzere olduğum şey aslında bir hata değil.

Gerçek şu ki, diğer dillerde ad alanlarının işlevselliği benzer şekilde uygulanmaktadır ve aynı zamanda diller, ad alanlarıyla etkileşim için ek işlevsellik sağlamaktadır.

Örneğin Java'da, import ifadesini kullanarak birden fazla sınıfı geçerli ad alanına aktarabilirsiniz. Java'da içe aktarma kullanıma benzer ve iç içe geçmiş ad alanlarını (veya paketleri) ayırmak için noktalar kullanır. İşte bir örnek:
dayle.blog.*'u içe aktar;
Bu, 'dayle.blog' paketindeki tüm sınıfları içe aktaracaktır.

Bunu PHP'de yapamazsınız. Her sınıfı ayrı ayrı içe aktarmanız gerekir. Üzgünüm. Aslında neden özür diliyordum? Devam edin ve PHP geliştirme ekibine şikayette bulunun, ancak sizden kibar olmanızı rica ediyorum. Son zamanlarda çok ilginç şeyler yaptılar.

İşte sorunu biraz hafifletmek için güzel bir numara. Önceki örnekteki sınıf yapısına sahip olduğumuzu hayal edin. Alt uzayın bir kısmını alıp ona bir takma ad verebiliriz.
Bu, çok sayıda sınıf kullanıldığında yararlı olabilir. Herkese iyi!

Tüm dilek ve önerilerinizi kişisel mesajla memnuniyetle kabul edeceğim, teşekkür ederim.