2009-10-19 17 views
27

PHP Manual suggests klas autoLoad jakKonwersja CamelCase do under_score_case w __autoload() w PHP

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

i takie podejście działa prawidłowo załadować klasę FooClass zapisany w pliku my_dir/FooClass.php jak

class FooClass{ 
    //some implementation 
} 

Pytanie

Jak mogę umożliwić używanie _autoload() funkcja i dostęp FooClass zapisany w pliku my_dir/foo_class.php?

Odpowiedz

68

Można przekonwertować nazwę klasy tak ...

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

Czy nie miałoby to problemów z nazwą klasy, np. * MyClassName *? –

+0

Dzięki za odpowiedź rikh, twoja magia działa! @ cballou, kod działa również w twoim przypadku. Testowałem go na następujących nazwach klas: FooClass, fooClass, myFooClass i MyFooClass. –

+0

@ cballou, nie, za każdym razem, gdy występuje mała litera, a następnie duża litera, między nimi wstawiane jest podkreślenie. Na koniec wywoływane jest wywołanie strtolower, aby zapewnić, że ostateczna nazwa jest cała małymi literami. –

2

To niesprawdzone ale użyłem czegoś podobnego przed przekonwertować nazwę klasy. Dodam, że moja funkcja działa również w trybie O (n) i nie polega na powolnych odsyłaczach wstecz.

// 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

Byłoby czystsze, gdybyś pozbył się magicznych liczb i użył czegoś bliższego: if (ord ($ nazwa_klasy [$ i])> = ord ('A ') && ord ($ nazwa_tabeli [$ i]) <= ord (' Z ')) { –

+1

To prawda, jednak planowałem optymalizację, ponieważ dwa kolejne wywołania ** ord() ** w pętli byłyby nieznacznie nadmierna IMO. –

+0

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