üst ve küçük classname autoloader

5 Cevap php

I am using this class in php for autoloading. http://pastebin.com/m75f95c3b

Ama bir yerde olduğunda

class Bar extends Foo

And I have a file called foo.class.php it won't find the class. But when i chagne the filename to Foo.class.php it will find the class.

Ben dosya wether onun orada ne olursa olsun bir sermaye ile ya da değil başlarsa, her zaman dosyayı bulmak için benim sınıf için bazı işlevsellik eklemek çalışıyorum. Ama şimdiye kadar scuceeded değil.

Herkes?

5 Cevap

Gumbo çözümü iyi biri olduğunu ve hemen hemen herkesin kullandığı buydu. Eğer sevmiyorum neden anlamıyorum. Tabii ki birinci sınıf adıyla bir dosya var büyük harfle olup olmadığını kontrol edin ve ardından küçük harfli sürümü var olup olmadığını kontrol değilse. Olabilir Bu kesinlikle Gumbo çözümü daha iyi değil. Sonuçta "sizin" programcı bazı sözleşmeler / kurallara uymak zorunda.

Lütfen dosyanın tüm küçük adları varsa, strtolower sınıfın her yöntemi $className değişken değeri için geçerlidir:

$className = strtolower($className);

Ama her geliştirici sopa olan bazı yönergeler kodlama taslak öneririz. Aksi takdirde büyük ve küçük harfleri kullanarak bir dosya adı yazma 2 <length of file name> olasılıkların her birini test etmek olacak.

Sen için. Php dosyaların dizinleri tarar ve aslında normal bir ifade kullanarak bu tür "class Foo" gibi kalıpları için her bir dosyanın içeriğini içine bakar bir autoloader kullanabilirsiniz. Sen tercihen form sınıfının bir dizi => dizini kullanarak, tabii ki, bu önbelleğe gerekir. Ayrıca emin örneğin, doğru önbellek geçersiz yapmak gerekir klasörüne yeni. php dosya olduğunda.

Benim web sitesi için bunu, ve o inşaat büyük.

Ben daha fazla veya daha az böyle yapardım

function __autoload($class_name) {
    $upperName = strtoupper(substr($class_name,0,1)) . substr($class_name, 1);
    $lowerName = strtolower(substr($class_name,0,1)) . substr($class_name, 1);

    //Check to see if the class file exists as-is
    if(file_exists($class_name . '.php')) {
        require_once($class_name . '.php');
    }elseif(file_exists($upperName . '.php')) {
        require_once($upperName . '.php');
    }elseif(file_exists($lowerName . '.php')) {
        require_once($lowerName . '.php');
    }else {
        throw new Exception("The class $class_name could not be found.");
    }
}

Farklı adlandırmasında olarak ortaya çıkan diğer conditionals eklemek için yeterli kolaydır.

Ben önceki geliştiricileri ile geriye dönük uyumluluğu sağlamak için dikkate birkaç farklı dosya adlandırma kuralları alır bir __ autoload () işlevini kullanın.

Her kongre ve o dosya varsa görmek için çek üzerinde basit bir döngü yapar. Dosya varsa, o zaman onu yükler.

Benim fonksiyonu için, ben böyle. Inc. Sınıf ya. Inc.php gibi farklı dosya uzantıları için bu yapmak. Sen aynı şeyi, ama üst ve alt birinci karakterleri aramak olabilir.

Ben 'bir dosya bulunamadı' açıklama ile başka bölümünde, searchForClassFile () yönteminde bu koymak istiyorsunuz.

EDIT (daha fazla bilgi):

Yinelemeli doğru dosyayı arayan bir sınıf dizinin içine girer ziyade, ben belirli bir konuma sınıf adını haritası. Bu yaygın bir uygulamadır. Örneğin, foo_bar [CLASS_DIRECTORY]/foo/bar.[EXTENSION] eşleştirilir. Bizim durumumuzda, biz birkaç farklı uzantıları kontrol edin.

Sizin durumunuzda, size sınıf dosyası aramak istiyorum, ama kodunu değiştirerek nasıl bir tasarım karar vermek zorunda:

} else {
  // Found a file
  if ($f == $className . self::$classFileSuffix ||
        $f == strtolower($className) . self::classFileSuffix) {
    return $subPath;
  }
}

Yerine strtolower of () sadece ilk karakteri düşürür, ya da> 5.3.0, PHP kullanarak if (resmen açıklanmadı değil) lcfirst () işlevini kullandığınızda bir işlev yazabilirsiniz.