2016-03-22 21 views
1

Composer'da psr-4 autoloading'i nasıl kullanmam gerektiği konusunda biraz kafam karıştı.Composer ile psr-4 autoloading kullanırken ad alanını neden belirtin?

/ 
|- Core/ 
| - Router.php 
|- App/ 
| - Models 
|  User.php 
|- composer.json 

Temelde, proje kök: en Böyle bir klasör yapısını var diyelim composer.json; Router php sınıfı içeren bir Çekirdek klasöründe; Bir Kullanıcı sınıfını içeren bir Modelleri klasörü içeren bir App klasörü.

Yönlendirici sınıf şuna benzer:

<?php 
namespace Core; 

class Router { 
} 

ve kullanıcılar sınıf aşağıdaki gibidir:

<?php 
namespace App\Models; 

class User { 
} 

Yani özdevinimli_yükle Composer psr-4 autoloader kullanarak bu sınıflar, yapabileceğim yapabilirsiniz bu composer.json:

{ 
    "autoload": { 
     "psr-4": { 
      "Core\\": "Core", 
      "App\\Models\\": "App/Models" 
     } 
    } 
} 

Öyleyse size koşudan sonra (onları gerektirmeden sınıflarını kullanabilirsiniz Böyle ning composer dump-autoload):

$router = new Core\Router(); 
$user = new App\Models\User(); 

hiçbir sorunları ile çalışır.

Ancak, ben de composer.json yapabilirsiniz:

, belgelere göre köküne göre herhangi ad olabilen bir geri dönüş dizin olmasına
{ 
    "autoload": { 
     "psr-4": { 
      "": "" 
     } 
    } 
} 

. Ben diyor ki besteci autoloader bu "boş" girdisini, alarak Yani özdevinimli_yükle benim sınıfların herhangi Doğru klasörü takip edebilirsiniz eğer, "kök başlayarak her ad bir sınıf için herhangi dizinde bak" adlandırma/ad alanı yapısı.

Peki, neden eski eğer ikincisi eserler ve bir daha basit sorumu yapacağını edilir? Performanslı bir şey mi? Yoksa başka bir sebebi var mı?

+0

Bilmiyorum ... neden * olur * seni? Yapmazdım. Sence neden yapmalısın? – deceze

+2

Biri için, eğer bir gün tüm modellerinizi başka bir yere taşımayı seçerseniz, eski yolu kullanarak sadece bir satırı değiştirebilir, ikinci adı kullanarak tüm ad alanlarını yeniden adlandırmanız gerekir. – apokryfos

+1

Özel/paket/src'de özel bir paketiniz varsa, büyük olasılıkla 'custom \ library \ src' adlı bir ad alanı, ancak sadece 'Library' yapmak istemezsiniz. Tüm bunlar, projenizde, apokyrfos'un yaptığı noktadan başka, konvansiyonlara düşer. – Devon

cevap

3

Neden hep yapmamalısınız "psr-4": {"": ""}?

Sebep 1: Maliyet performansı. Tanım, otomatik yüklemeye ihtiyacı olan HER sınıf için Composer'ın kök dizine bakması gerektiğini söylüyor. Bu sınıflar sadece paketinizdekiler değil, diğer tüm sınıflar da.

Besteci sonuçsuz aramaları hatırlayarak bu çabayı biraz optimize etmeye çalışır, ancak aynı öneki ile başka bir sınıf yüklerseniz bu sadece öder.

Sebep 2: PSR-4 özü bir dizin yolu eşlenmiş bütün ad yolunu olması kalmamasıdır.Bir \Vendor\Template\Escaping\Output\* gibi sınıfların çok belirli bir grup ile ilgilenen paketi, ve başka bir şey olduğunu varsayarsak (küçük paketler sahip daha kolay çok fazla kod eklemeden onları yeniden kullanmak yapar) kullanarak,src/Vendor/Template/Escaping/Output/AnyClass.php onları var ve

tanımlayabilir
"psr-4": { 
     "\\Vendor\\Template\\Escaping\\Output\\": "src/Vendor/Template/Escaping/Output/" 
} 

Ayrıca src/AnyClass.php halinde sınıfı koymak ve

"psr-4": { 
     "\\Vendor\\Template\\Escaping\\Output\\": "src/" 
} 

tanımlamak ve bu marjinal (bence - gerçi hiçbir rakamlar var) hızını artırmak, önemli ölçüde dizin yolu kısaltır olabilir, ama çoğunlukla nedeniyle şeyi gelişmekte iyileştirilmesi için boş klasörlerin daha az açılması.

Aynı paketin hem Core ad alanı hem de App ad alanı olması şüpheli hale getirir: Bunların her biri için neden bir paket yok?

+0

Güzel açıklama, teşekkürler. Psr-4'ün eşleşen klasörlere ve ad alanlarına sahip olması gerektiği konusunda yanlış izlenim vardı. Core ve App için ayrı paketler gelince, iyi bir nokta, bunlar sadece bu soru için seçtiğim örneklerdir ;-) –

+0

Tek soru: Neden PSR-4 hem isim-alan hem de dizin gerektiriyor, neden ad alanı ile mutlu değiller? bir tek ? –

+0

@AmarjeetChaudhary PSR-4 yapılarının başlangıç ​​dizinini sizin beğeninize göre tanımlamak için tam özgürlüğünüz var, ancak bir şekilde bir dizin sağlamanız gerektiğinden, nereden bakmaya başlayacağınızı nereden biliyorsunuz? Bir projenin kök dizinini tanımlamak mantıklı bir varsayılan değer değildir, çünkü README gibi meta veriler, composer.json, '.gitignore' genellikle depolanır. Başka bir dizinin varsayılan olarak tanımlanması da bir ad üzerinde nasıl anlaşılacağı sorusunu taşır. 'src' birçok proje için ortak bir seçim gibi görünüyor, ancak herkes üzerinde zorlanmıyor. – Sven

-3

PSR-4, INTO fiziksel dizinleri ad alanlarını çeviren bir standarttır.

1

Genellikle, besteci kullanırken kendi projeniz için yalnızca bir klasörünüz vardır. O zaman sadece bir isim alanını belirtmeniz yeterlidir.

o zaman sadece bir Belirtilen ad var sen

/ 
|- lib/ 
| - Core/ 
|  - Router.php 
| - App/ 
|  - Models 
|   User.php 
|- composer.json 

için dosya yapısı yeniden düzenlemek ve

{ 
    "autoload": { 
     "psr-4": { 
      "MyApp\\": "lib/" 
     } 
    } 
} 

için composer.json değiştireceğini düşünün ve bu konuda başka ad alanları eklemek için ihtiyacım yok . Böyle Sınıflarınızı çağırabilir:

$router = new \MyApp\Core\Router; 
$user = new \MyApp\App\Models\User; 

veya böyle

:

namespace MyApp; 
$router = new Core\Router; 
$user = new App\Models\User; 
İlgili konular