2009-10-19 13 views
27

PHP-Handbuch suggests automatisch zu laden Klassen under_score_case wieConvert Camelcase in php __autoload()

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

und dieser Ansatz funktioniert gut Klasse laden FooClass in der Datei gespeichert my_dir/FooClass.php wie

class FooClass{ 
    //some implementation 
} 

Frage

Wie kann ich es möglich machen,zu verwendenFunktion und Zugriff FooClass in der Datei gespeichert my_dir/foo_class.php?

Antwort

68

Sie können den Klassennamen wie dieser ...

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

Hätte dies keine Probleme mit einem Klassennamen wie * myClassName *? –

+0

Danke für die Antwort Rikh, deine Magie funktioniert! @cballou, der Code funktioniert auch in deinem Fall. Ich habe es mit den folgenden Klassennamen FooClass, fooClass, myFooClass und MyFooClass getestet. –

+0

@cballou, nein, jedes Mal, wenn ein Kleinbuchstabe gefolgt von einem Großbuchstaben erscheint, wird ein Unterstrich dazwischen eingefügt. Schließlich wird ein Aufruf an strtolower vorgenommen, um sicherzustellen, dass der endgültige Name nur Kleinbuchstaben enthält. –

2

Dies ist nicht getestet konvertieren, aber ich habe etwas ähnliches verwendet vor den Klassennamen zu konvertieren. Ich könnte hinzufügen, dass meine Funktion auch in O (n) läuft und nicht auf langsame Rückverweise angewiesen ist.

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

Es wäre sauberer, wenn Sie die magischen Zahlen loswerden würden und etwas näher an: if (ord ($ class_name [$ i])> = ord ('A ') && ord ($ class_name [$ i]) <= ord (' Z ') { –

+1

Das stimmt, aber ich ging für die Optimierung, da zwei weitere Aufrufe von ** ord() ** innerhalb einer Schleife wären etwas übermäßige IMO. –

+0

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