PSR-0 ve PSR-4 arasındaki farklar nelerdir?


225

Son zamanlarda isim alanlarını ve nasıl faydalı olduklarını okudum. Şu anda Laravel'de bir proje oluşturuyorum ve sınıf haritası otomatik yüklemesinden ad boşluğuna geçmeye çalışıyorum. Ancak, PSR-0 ve PSR-4 arasındaki gerçek farkın ne olduğunu kavrayamıyorum.

Okuduğum bazı kaynaklar ...

Anladığım şey:

  • PSR-4, alt çizgileri dizin ayırıcılara dönüştürmez
  • Bazı özel besteci kuralları, dizin yapısının karmaşıklaşmasına neden olur ve bu da PSR-0 ad boşluklarını ayrıntılı hale getirir ve böylece PSR-4 yaratılır

Farkı açıklayan örnekler takdir edilecektir.


3
PSR0 ve PSR4'ü okuyun . Her ayrıntıyı açıklıyorlar.
Sverri M. Olsen


4
☝️ Birisi bunun cevabını bir cevap olarak yazmalıdır ... :)
deceze

1
IMO,
PSR'deki

Yanıtlar:


283

Çok benzerler, bu yüzden biraz kafa karıştırıcı olması şaşırtıcı değil. Özet, PSR-0'ın PSR-4'ün bıraktığı PEAR tarzı sınıf adları için bazı geriye dönük uyumluluk özelliklerine sahip olmasıdır, bu nedenle yalnızca ad alanı kodunu destekler. Üstüne üstlük PSR-4, bir dizin yapısı olarak tüm isim alanına sahip olmaya zorlamaz, sadece bağlantı noktasını takip eden parçaya sahip olmanızı sağlar.

Örneğin bunu tanımlarsanız Acme\Foo\ad kenetlenmiş src/PSR-0 ile, bunun için bakmak anlamına gelir Acme\Foo\Bariçinde src/Acme/Foo/Bar.phpPSR-4'te bunun bunun için bakacağız ise src/Bar.phpkısa dizin yapıları için izin. Öte yandan bazı Ayrıca söyleyebiliriz kadar net, hangi ad alanında ne olduğunu görmek için tam dizin yapısını olmasını tercih Acme\Foo\olduğunu src/Acme/FooPSR-4 will size PSR-0 davranışa eşdeğer verir yukarıda açıklanan ile.

Yeni projeler ve birçok amaç ve amaç için uzun öykü kısa, PSR-4'ü kullanabilir ve PSR-0 hakkında her şeyi unutabilirsiniz.


17
src/Bar.phpEğer diyorsan seçerAcme\Foo\ => src/
Seldaek

Açıklama için çok teşekkür ederim!
尤川豪

4
PSR-4, PSR-0'dan daha yavaş, değil mi?
Nguyen Linh

2
@NguyenLinh Ben öyle düşünmüyorum. Aynı şeyi yapar, ancak muhtemelen daha az düzeydeki dizinlerle, bu yüzden biraz daha hızlı olabilir. Onu ölçmek. PSR-0 ve PSR-4 arasında geçiş yapabileceğiniz bir paket oluşturabilirsiniz - Bir fark göreceğinizi sanmıyorum.
Sven

44

İşte büyük farklar,

1. Örneğin, Acme\Foo\ad alanının bağlantılı olduğunu tanımlarsanız src/,

  • PSR-0 ile Acme\Foo\Bar,src/Acme/Foo/Bar.php
  • PSR-4'te bunun arar iken Acme\Foo\Barde src/Bar.php(where Bar class is).

2. PSR-4, alt çizgileri dizin ayırıcılara dönüştürmez

3. PSR-4'ü ad alanlarıyla kullanmayı tercih edersiniz

4. Sınıf adı dosya adından farklı olsa bile PSR-0 çalışmaz, yukarıdaki örnekte olduğu gibi:

  • Acme\Foo\Bar ---> src/Acme/Foo/Bar.php (Bar sınıfı için) çalışacak
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php(Bar sınıfı için) çalışmaz

1
PSR-4'ü kesinlikle ad alanı komut dosyaları olmadan kullanabilirsiniz, böyle bir kısıtlama yoktur ve bunu kullanıyorum (seçimim değil)
Galvani

PSR-4 vakası için Bar 1'den (ilk puan) nereden geldi?
cjmling

31

PSR-4, 'göreli yol', PSR-0, 'mutlak yol' gibi bir şeydir.

Örneğin

yapılandırma:

'App\Controller' => 'dir/'

PSR-0 otomatik yükü:

App\Controller\IndexController --> dir/App/Controller/IndexController.php

PSR-4 otomatik yükü:

App\Controller\IndexController --> dir/IndexController.php

PSR-0 ve PSR-4 arasındaki ayrıntılarda biraz daha fark var, buraya bakın: http://www.php-fig.org/psr/psr-4/


10

Ad alanı / klasör kuralı.

Sınıflar, ad alanlarına göre klasörlerde saklanmalıdır.

Genel olarak, kök klasörünüzde vendor / ile aynı seviyede oturan bir src / dizini oluşturacak ve projelerinizi buraya ekleyebilirsiniz. Aşağıda klasör yapısına bir örnek verilmiştir:

.
+-- src
    |
    +-- Book 
    |   +-- History
    |   |   +-- UnitedStates.php - namespace Book\History;
    +-- Vehicle
    |   +-- Air
    |   |   +-- Wings
    |   |   |   +-- Airplane.php - namespace Vehicle\Air\Wings;
    |   +-- Road
    |   |   +-- Car.php - namespace Vehicle\Road;
+-- tests
    +-- test.php
+-- vendor

Psr-0 ve psr-4 arasındaki fark

PSR-0

Kullanımdan kaldırıldı. Baktığımızda vendor/composer/autoload_namespaces.phpdosyanın İsim alanlarının ve onlar eşleştirilmiş olduğu dizinleri görebilirsiniz.

composer.json

"autoload": {
        "psr-0": {
            "Book\\": "src/",
            "Vehicle\\": "src/"
        }
} 
  • Aradığım Kitap içinde \ Tarih \ UnitedStates src / Kitap /History/UnitedStates.php
  • Aradığım Araç içinde \ Hava \ Wings \ Airplane src / Araç /Air/Wings/Airplane.php

PSR-4

Baktığımızda vendor/composer/autoload_psr4.phpdosyanın İsim alanlarının ve onlar eşleştirilmiş olduğu dizinleri görebilirsiniz.

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • Aradığım Kitap içinde \ Geçmişi \ UnitedStates src /History/UnitedStates.php
  • Aradığım Araç içinde \ Hava \ Wings \ Airplane src /Air/Wings/Airplane.php

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • Aradığım Kitap \ Tarih \ UnitedStates src / Kitap /History/UnitedStates.php
  • Aradığım Araç içinde \ Hava \ Wings \ Airplane src / Araç /Air/Wings/Airplane.php

-4

Denediğimde bile, Besteci dağınık. Ne yazık ki, pazarın tek alternatifi.
Neden bir karmaşa?
Composer'ın otomatik tamamlama özelliği, kodu kontrol ediyorsanız iyi çalışır. Ancak, farklı bir projeyi içe aktarıyorsanız, kendinize çok sayıda stil ve klasör oluşturmanın yollarını bulabilirsiniz. Örneğin, bazı projeler /company/src/class.php, diğerleri ise şirket / class.php, diğerleri ise şirket / src / class / class.php'dir.

Bunu çözen bir kütüphane oluşturdum:

https://github.com/EFTEC/AutoLoadOne (ücretsiz, MIT).

Bir klasörün tüm sınıflarını tarayarak bir otomatik ekleme oluşturur, bu nedenle her durumda çalışır (psr-0 psr-4, ad alanı olmayan sınıflar, birden çok sınıflı dosya).

edit: Ve tekrar, herhangi bir sebep olmadan indirildi. ;-)


Composer.json içindeki classmap seçeneği hakkında bilgi edinin. getcomposer.org/doc/04-schema.md#classmap - cevabınızı küçümsemenin nedeni olabilir.
Patrick
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.