O yolları tanımlanmış bir dizi arar ki, böyle bir şekilde PHP'nin autoloader işlevselliğini kaldıraç nasıl?

4 Cevap php

Autoloader kullanma hakkında kötü bir şey nerede bakmak bilmiyor olmasıdır. Benim çerçeve zaten yaklaşık 15 farklı dizinlere yaklaşık 70 sınıfları vardır. Bu nedenle, ben autoload için gitmedim, ama bunun yerine üreten yolları etrafında mücadele. Yani benim kök dosyasından gitmek istediğiniz yere bana yollarını vermek bir ilişkisel yolları dizi var. O inşaat, ama gerçekten bir ağrı oluyor.

Birincisi benim çerçevenin kullanıcı çok büyük olasılıkla bir sınıf bulunduğu büyük bir fikrim yok olacaktır. Bunu dahil yolunu gerekir sırf bu yüzden bir FormViewController oluşturarak zaten bir ağrıdır.

Başlangıçta, ben PHP özdevinimli bunu istediği zaman birden fazla dizin aracılığıyla dosya için "arama" için olsaydı gayet güzel olacağını düşünüyorum. Peki ne oldu? PHP mı bunu ve bize acı bir sürü kaydedebilirsiniz. Ama çoğu yöneticileriniz nasıl yaparsın?

Orada ben küresel bir bağlam nesnenin çıkmak $ yolları adında bir dizi var. Yolları en makul sırayla dizide tanımlanmış olabilir: en sık kullanılan yolları ile başlayarak.

Ben PEAR kütüphanesi sistemi / görüşlerini Yükleyici'ye dönüştürülür alır system_views_specialviews_SpecialView.php gibi komik bir adlandırma kuralı olduğunu biliyorum / specialviews / SpecialView.php ... ama dürüst olmak gerekirse, bu korkunç. Pisliği benim gibi bu dosya adlarını istemiyorum. Sadece hemen emmek kendi sınıfları oluşturur geliştirici için.

Ben bu görev için tekerleği yeniden icat etmeden önce, belki birisi bunun için bir çözüm bilen?

4 Cevap

NB: Ben sana spl_autoload_register, vb aracılığıyla kendi özel autoloader yaratıyoruz küstah değilim

Bir autoloader oluştururken ve eklemek için aradığınız sınıflar 15 farklı dizinlere yayılmış ise bu açıkça yaramıyor olsa, ben ', dizin yolunu haritalama sınıf adının bazı formunu kullanarak önlemek için umut olabilir nasıl görmüyorum t alıntı örnek olarak oldukça derin olması gerekir.

Basit bir düzeyde, tek bir alanda sistem kütüphanelerinin tüm tutmak, sonra hızlı bir vaka maç gibi ...

switch(true) {

    case substr($className, 0, 6) == 'System': { $libraryPath = 'xxx'; break; }
    ...
}

Açıkçası elle kontrol etmeniz gerekir kaç yolları baglidir ..., oldukça verimli bir yaklaşım olmalıdır.

Ayrıca, ben size önce autoload için çalışırken sınıfın varlığı için kontrol ediyoruz tahmin? (Örn:. Bunu zaten dahil değil emin olmak için bir class_exists ($ SınıfAdı) yapıyoruz) Sonra tekrar, bu gereksinimin ne sıklıkta yeniden kullanım nesnelerinin bağlıdır.

Sen Nette Framework's RobotLoader bakmak isteyebilirsiniz.

Temel fikir bu, ayrıştırır .php (token_get_all ) files and finds out in which file are which classes/interfaces. Locations of classes/interfaces are cached, so it is fast. Loader is registered with spl_autoload_register() and when PHP interpreter cannot find some class, it calls loader's tryLoad() yöntemi belirtmek dizinleri tarıyor olmasıdır.

Ben zaten bunu biliyorum eminim, ama sadece durumda, ön denetleyicisi bir parametre olarak sınıf adını alır (ya da bir __autoload() (API) işlevi yazabilirsiniz İstediğiniz kriterlere göre dizinleri arar onun tarafından dahil herhangi bir dosya). Tüm yapmanız gereken, onu bulduktan sonra require_once doğru dosya, ya da sınıf adı geçerli değilse bir istisna atar.

Açıklamasından, senin bu yaptıklarını herhangi bir belirti alamadım. Sadece PHP'nin hantal küresel diziler değerlerle yolunu içerir ekleme gibi geliyor.

PHP Autoloader istediğin yapar. Farklı yerleri varsa, sadece her sınıf yolu için robotun çeşitli örneklerini oluşturmak zorunda.

Bu ilk arama, bazı istihbarat ile yapılır dışında bu, söz konusu RobotLoader gibi aynı işi yapar gibi görünüyor. Sınıf adının alt Levenshtein mesafe çekimler potansiyel sınıf tanımları olarak tercih edilmektedir. Ama bu endeks olmadan ilk arama için sadece ilgili.