PHP de dahil / gerektirir vs ad alanlarının artıları ve eksileri?


20

Geçenlerde PHP'de ad alanlarını kullanmaya başladım. Onları ilk gördüğümde, söz dizimlerinin çirkin olduğunu düşündüm ve onları asla kullanmayacağım. Ancak, bir daha asla bir include / requir deyimi yazmak zorunda kalmasını sağlayan bir otomatik yükleyici (spl_autoload_register) oluşturdu.

Ad alanlarını seviyorum, ancak include / requir ifadeleri üzerinde herhangi bir nesnel fayda var mı, yoksa aynı hedefe ulaşmak için aynı yöntem mi?


1
Ad alanları, üçüncü taraf kitaplıklarıyla çarpışmaları önler.
Reactgular

1
Şu anda isim alanlarıyla ilgili benim için en önemli fayda otomatik yükleme. Örneğin new \Vendor\Namespace\Class(), yöntem veya sınıfta daha önce bir Require deyimi olmadan satır içi kullanın .
NobleUplift

3
Birçok PHP kütüphanesi, ad alanı olmadan otomatik yüklemeyi kullanır. PHP ad alanlarını zorunlu hale getirmelidir.
Reactgular

Benden tartışma yok. Tüm bu değişikliklerin burada listelendiğini görmek istiyorum .
NobleUplift

Yanıtlar:


21

Ad alanları yalnızca otomatik yükleme sınıfları için değildir. Ayrıca adlandırma çatışmalarını önlerler. Aslında, bu onların birincil amacı.

Diyelim ki Useruygulamanızın kullanıcıları hakkında bilgi depolamak için adlı bir sınıfa ihtiyaç duyan bir projeniz var , ancak bir eklenti de Userbilgileri depolamak için adlandırılmış (farklı) bir sınıf kullanıyor . Ad alanları, sınıfınızı bir ad alanı (örneğin, MyApp) içinde oluşturmanıza ve eklentinin başka bir ad alanı (örneğin, CoolPlugin) kullanmasına izin verir . MyAppBoşluktaki kod sadece referans verebilir User(örn. new User();) Ve böylece CoolPluginboşlukta kodlama yapabilir ; her biri beklenen sonucu alır. Başka bir ad alanından kod kullanmanız gerektiğinde, kodun önekini eklemeniz yeterlidir . Örneğin, CoolPluginboşluktaki kod Usersınıfa MyAppüzerindennew \MyApp\User();

Alternatif olarak, her sınıf ve gibi her yerde karmaşık bir ada ihtiyaç duyar . Ad alanları, çoğu zaman işleri basitleştirmenizi ve çakışmaları her zaman adlandırmaktan kaçınmanızı sağlar.class MyApp_Userclass CoolPlugin_User

Düzenleme: "İkisi arasında herhangi bir performans farkı var mı?"

Anlamlı değil, hayır. Ben karşılaştırmak değil, ama muhtemelen nanosaniye düzeyinde bir fark var. Bununla birlikte, süper küçük performans ayarlamaları için kod kalitesinden ödün vermek iyi bir strateji değildir, bu nedenle ad alanlarını dikkate almadan kullanmalısınız. Benzer türden karşılaştırmalar için PHPbench.com ve bu StackOverflow cevabına bakınız .

Bu tür bir bağlamda mikro optimizasyon konusunda endişelenmeden önce kodunuzun inanılmaz derecede sıkı ve inanılmaz derecede zaman duyarlı olması gerekir (yüksek frekanslı ticareti veya nükleer reaksiyonları yönetmeyi düşünün). Eğer gerçekten bu kadar zamana duyarlıysa, PHP gibi yorumlanmış diller değil, muhtemelen ve hatta kodlama yapmalısınız .


1
+1 Her projenin isim alanına ihtiyaç duymayacak gibi görünmeye başladığını ve sonra onlarsız çalışmak için etrafta dolanmanın saçma hale geldiği noktaya kolayca büyüdüğünü not ediyorum. Ad alanlarına sahip olmama temel olarak, sınıflara uygulandığı şekliyle her değişkeni genel olarak bildirmekle aynıdır. Daha büyük kod tabanlarında veya kütüphaneleri liberal olarak kullananlarda tam bir karmaşa haline gelir.
BrianH

1
Lütfen yukarıdaki düzenlememe bakın.
elixenide

2
Büyük Hadron Çarpıştırıcısı için bir PHP arayüzü yaptığımı söylemiş miydim? Aksi takdirde, bu cevabın yeterli olduğuna inanıyorum, teşekkür ederim.
NobleUplift

1
Lütfen herhangi bir kuark yıldızı veya kara delik oluşturmayın! Yardımcı olduğuma sevindim.
elixenide

1
Endişelenme, sadece yabancılar. Hadron topları yaratıyoruz - yani bir şey, silah değil, bilim.
NobleUplift
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.