2009-10-19 15 views
27

CamelCase'i php __autoload() içindeki under_score_case klasörüne dönüştürün

function __autoload($class_name){ 
require_once("some_dir/".$class_name.".php"); 
} 

ve bu yaklaşım gibi özdevinimli_yükle sınıflarına

PHP manuel suggests bunu nasıl yapabilirim

class FooClass{ 
    //some implementation 
} 

Soru

gibi dosya my_dir/FooClass.php kaydedilen sınıf FooClass yüklemek için çalışıyor _autoload() işlevini kullanmak ve my_dir/foo_class.php dosyasına kaydedilen FooClass erişmek mümkün mü?

cevap

68

Sen

function __autoload($class_name){ 
    $name = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $class_name)); 
    require_once("some_dir/".$name.".php"); 
} 
+0

Bu, * myClassName * gibi bir sınıf adıyla ilgili sorun yaşanmaz mı? –

+0

Cevabınız için teşekkürler, siheriniz çalışıyor! @cballou, kod da senin davanda çalışıyor. FooClass, fooClass, myFooClass ve MyFooClass sınıfında aşağıdaki sınıf isimlerini test ettim. –

+0

@cballou, nope, her defasında bir küçük harf ve ardından bir büyük harfle, aralarında bir alt çizgi eklenir. Son olarak, son adın küçük harf olduğundan emin olmak için strtolower çağrısı yapılır. –

2

Bu denenmemiş olduğunu ... böyle sınıf adını dönüştürmek olabilir ama sınıf adı dönüştürmek için önce benzer bir şey kullandık. Benim fonksiyonumun da O (n) de çalıştığını ekleyebilir ve yavaş geri göndermeye güvenmiyor.

// lowercase first letter 
$class_name[0] = strtolower($class_name[0]); 

$len = strlen($class_name); 
for ($i = 0; $i < $len; ++$i) { 
    // see if we have an uppercase character and replace 
    if (ord($class_name[$i]) > 64 && ord($class_name[$i]) < 91) { 
     $class_name[$i] = '_' . strtolower($class_name[$i]); 
     // increase length of class and position 
     ++$len; 
     ++$i; 
    } 
} 

return $class_name; 
+1

Sihirli sayılardan kurtulduktan ve daha yakın bir şeye kullandığınız takdirde daha temiz olurdu eğer: (ord ($ class_name [$ i])> = ord ('A ') && ord ($ class_name [$ i]) <= ord (' Z ')) { –

+1

Bu doğrudur, ancak bir döngü içinde ** ord() **' ya iki arama daha olacağı için optimizasyona gidecektim biraz aşırı IMO. –

+0

$ class_name [$ i] = '_'. strtolower ($ class_name [$ i]); // NE ? –

İlgili konular