Geliştirici İpuçları – PHP'de Ad Alanları

Yayınlanan: 2020-03-06

Yaklaşık bir yıl önce WordPress, gerekli minimum PHP sürümünü (2010'dan beri kullanılan) 5.2'den daha güncel bir sürüme güncellemeye karar verdi. Aslında, Bugün WordPress tarafından önerilen minimum PHP sürümü en yeni sürümlerden biridir: PHP 7.3.

Basit bir WordPress kullanıcısıysanız, bu muhtemelen sizi çok fazla etkilemeyecektir (bu yeni sürümlerin daha iyi performans sağladığı gerçeğinin ötesinde).

Ancak bir geliştiriciyseniz, bu yeni PHP sürümleri, eklentilerinizde ve temalarınızda kullanabileceğiniz bazı harika özelliklere sahiptir. Ve bugün, özellikle, sizinle uzun zamandır bizimle olan ama isim alanlarından bahsetmek istiyorum.

WordPress ve kod önekleri

Bir WordPress geliştiricisi olarak öğrendiğiniz ilk kurallardan biri, "ad çakışmalarını" önlemek için "yaptığımız her şeyde önek kullanmak"tır. WordPress en iyi uygulamalarında okuyabileceğimiz gibi:

Eklentiniz bir değişken, işlev veya sınıf için başka bir eklentiyle aynı adı kullandığında bir adlandırma çakışması meydana gelir.

[Ad çakışmalarını önlemek için], tüm değişkenler, işlevler ve sınıflar benzersiz bir tanımlayıcıyla önek olmalıdır. Ön ekler, diğer eklentilerin değişkenlerinizin üzerine yazmasını ve yanlışlıkla işlevlerinizi ve sınıflarınızı çağırmasını engeller. Aynı şeyi yapmanızı da engelleyecektir.

WordPress eklentileri geliştirmek için en iyi uygulamalar

Bu nedenle, örneğin, get_site_id gibi bir işlev oluşturmak yerine, onu nelio_content_get_site_id olarak adlandırmak daha iyidir. Bu şekilde, belirli bir işlevin ( get_site_id ) ait olduğu eklentiyi ( nelio_content ) veya temayı hızlı bir şekilde belirleyebilir ve birkaç eklenti aynı işlevi tanımlamaya çalışırsa ölümcül hatalardan kaçınabiliriz.

Ön ekleri kullanmak, bir "ad alanı" yaratmanın ilkel bir yoludur; daha iyi bir alternatifimiz olmadığında uygulamamız gereken bir geçici çözüm. Aynı öneki kullanan tüm bu öğeler, aynı kümenin veya ad alanının parçasıdır. Ancak bu, gereksiz yere daha karmaşık kodla sonuçlanır: ad alanlarını taklit etmekten başka hiçbir amaca hizmet etmeyen önekler nedeniyle adlar daha uzundur.

PHP Ad Alanları

PHP sürüm 5.3, ad alanı kavramını tanıttı. Belgelerde verdikleri tanım bana mükemmel görünüyor, bu yüzden burada yeniden üretiyorum:

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 hizmet eder ve içindeki dosyalar için bir ad alanı görevi görür. Somut bir örnek olarak, foo.txt dosyası hem /home/greg dizininde hem de /home/other dizininde bulunabilir, ancak foo.txt dosyasının iki kopyası aynı dizinde bir arada bulunamaz.

PHP dünyasında, ad alanları, sınıflar veya işlevler gibi yeniden kullanılabilir kod öğeleri oluştururken kitaplık ve uygulama yazarlarının karşılaştığı iki sorunu çözmek için tasarlanmıştır:

1. Oluşturduğunuz kod ile dahili PHP kodu veya üçüncü taraf kodu arasındaki çarpışmaları adlandırın.

2. Extra_Long_Names'i takma (veya kısaltma) yeteneği, kaynak kodunun okunabilirliğini artırır.

PHP belgeleri

Bir ad alanı nasıl oluşturulur

PHP'de bir ad alanı oluşturmak son derece kolaydır. Oluşturduğunuz PHP dosyasının başına, kullanmak istediğiniz isimle bir namespace yönergesi ekleyin ve o dosyada tanımladığınız "her şey" o namespace'e ait olacaktır:

 <?php namespace Nelio_Content;

Evet, bu kadar basit! Şimdi orada yarattığımız “her şey” Nelio_Content ad alanında olacak. Örneğin, başta bahsettiğim gibi bir fonksiyon tanımlarsam:

 <?php namespace Nelio_Content; function get_site_id() { // ... }

artık get_site_id öğesinin Nelio_Content ad alanının içinde olduğunu biliyoruz. Bu şekilde, işlevi tanımlarken artık nelio_content_ önekini kullanmak zorunda değiliz. Harika!

Ad Alanlarına İlişkin İstisnalar

Buraya kadar anlattıklarımı yakından incelerseniz, tırnak içinde “her şey” yazdığımı göreceksiniz: “oraya eklediğimiz 'her şey' belirtilen ad alanına ait olacaktır.” Neden bunu yaptım? Ad alanları yazdığımız tüm kodlar için geçerli olmadığından… bazı istisnalar vardır.

PHP ad alanları yalnızca aşağıdaki PHP öğelerini kapsar:

  • sınıflar
  • Arayüzler
  • Özellikler
  • Fonksiyonlar
  • const ile bildirilen ancak define ile bildirilmeyen sabitler

Ek olarak, WordPress'te kendi ad alanlarına da ihtiyaç duyan bazı ek şeyler vardır ve ne yazık ki PHP ad alanları kapsamaz: komut dosyası tanıtıcılarınız , veritabanı seçenekleriniz veya özel içerik türleri ve bunların meta verileri vb. önekleri kullanmaya devam edin.

Öğeleri Bir Ad Alanından Diğerine Nasıl Aktarılır

Kendi ad alanınızda bulunan bir öğeyi kullanmanız gerekiyorsa, özel bir şey yapmanız gerekmez: onu adıyla çağırmanız yeterlidir. Örneğin, aşağıdaki kod parçacığında:

 <?php namespace Nelio_Content; function get_site_id() { // ... } function get_auth_token() { $site_id = get_site_id(); // ... }

Her ikisi de Nelio_Content ad alanında olmak üzere iki işlev tanımladığımızı görebilirsiniz: get_site_id ve get_auth_token . get_auth_token get_site_id , her zamanki gibi onu çağırır.

Öte yandan, farklı bir ad alanında get_site_id kullanmanız gerekiyorsa, tam tanımlayıcısını kullanarak işlevi çağırmalısınız:

 <?php namespace Something_Else; function do_some_action() { $site_id = Nelio_Content\get_site_id(); // ... }

veya işlevi use anahtar sözcüğüyle içe aktarmalısınız:

 <?php namespace Something_Else; use Nelio_Content\get_site_id; function do_some_action() { $site_id = get_site_id(); // ... }

Şahsen ikinci seçeneği çok seviyorum: diğer ad alanlarından işlevleri içe aktarmak için use anahtar sözcüğünü kullanarak, dosyanızın başlığına hızlıca göz atabilir ve bağımlılıklarını belirleyebilirsiniz.

PHP Ad Alanları ile WordPress Filtreleri ve Eylemleri

WordPress filtreleri ve eylemlerinin yanında ad alanlarını kullanırken aklınızda bulundurmanız gereken önemli bir ayrıntı vardır. Filtre ve eylem geri aramalarını belirttiğinizde, bunu genellikle geri arama adını bir dize olarak vererek yaparsınız:

 <?php // ... add_action( 'init', 'do_some_action' );

Sorun şu ki, bu işlev bir ad alanı içindeyse, önceki kanca beklendiği gibi çalışmayacaktır; WordPress'e işlevin tam adını söylemelisiniz. Başka bir deyişle, ad alanını (varsa) eklemeniz gerekir.

Kancayı, ad alanının kendisini tanımladığınız dosyaya mı ekliyorsunuz? Önemli değil, tam adı kullanın:

 <?php namespace Nelio_Content; function do_some_action() { // ... } add_action( 'init', 'Nelio_Content\do_some_action' );

Başka bir ad alanında mısınız, ancak işlevi use ile içe aktardınız mı? Önemli değil, tam adı kullanın:

 <?php namespace Something_Else; use Nelio_Content\do_some_action; // ... add_action( 'init', 'Nelio_Content\do_some_action' );

Ad Alanlarımızla Takma Adları Kullanma

Ad alanlarının çok ilginç bir başka işlevi de takma addır. Aşağıdaki senaryoyu hayal edin:

 <?php namespace Nelio_Content; function get_site_id() { // ... }

Bu işlevi başka bir ad alanında kullanmak istersem, bunu use ile yapabileceğimi zaten gördük. Ancak, içinde kullanmak istediğim modül zaten get_site_id adlı bir işleve sahipse bu işlevi nasıl kullanırım?

Neyse ki benim için, ithalatlarımızı yeni isimlerle adlandırabiliriz:

 <?php namespace Something_Else; use Nelio_Content\get_site_id as get_nc_site_id(); function get_site_id() { // ... } function do_some_action() { $nc_site_idd = get_nc_site_id(); // ... }

Ad Alanlarını Bugün Kullanmaya Başlayın!

Ad alanları, ad çakışmalarını önlemek ve kodumuzu düzenlemek için harika bir araçtır. Aslında ve bu gönderiye yorum yapmamış olmama rağmen, kullandığınız ad alanlarının yapısına ve kodu dizinler ve dosyalar halinde nasıl düzenlediğinize bağlı olarak PHP'nin sınıfları otomatik olarak yüklemesine izin veren PSR-4 gibi standartlar var.

Henüz projelerinizde ad alanlarını kullanmıyorsanız, bundan sonra buna başlamanızı öneririz. Yorumlardaki deneyiminizi bize anlatın!

Unsplash'ta Chaitanya Tvs'in öne çıkan görseli.