2009-10-19 9 views
27

manuel PHP suggests aux classes autoload commeConvertir CamelCase à under_score_case en php __autoload()

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

et cette approche fonctionne très bien pour charger la classe FooClass enregistré dans le fichier my_dir/FooClass.php comme

class FooClass{ 
    //some implementation 
} 

Question

Comment puis-je permettre d'utiliser _autoload() fonction et accès FooClass enregistré dans le fichier my_dir/foo_class.php?

Répondre

68

Vous pouvez convertir le nom de la classe comme ça ...

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

Cela ne poserait-il aucun problème avec un nom de classe comme * myClassName *? –

+0

Merci pour la réponse rikh, votre magie fonctionne! @cballou, le code fonctionne aussi dans votre cas. Je l'ai testé sur les noms de classe suivants: FooClass, fooClass, myFooClass et MyFooClass. –

+0

@cballou, non, chaque fois qu'il y a une lettre minuscule suivie d'une lettre majuscule, un trait de soulignement est inséré entre eux. Enfin, un appel à strtolower est fait pour s'assurer que le nom final est en minuscules. –

2

Ce n'est pas testé mais j'ai utilisé quelque chose de similaire avant de convertir le nom de la classe. J'ajouterai que ma fonction s'exécute aussi dans O (n) et ne repose pas sur des backreferences lentes.

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

Ce serait plus propre si vous vous débarrassiez des nombres magiques et utilisiez quelque chose de plus proche de: if (ord ($ class_name [$ i])> = ord ('A ') && ord ($ class_name [$ i]) <= ord (' Z ')) { –

+1

Ceci est vrai, mais j'allais pour l'optimisation que deux autres appels à ** ord() ** dans une boucle serait OMI légèrement excessive. –

+0

$ nom_classe [$ i] = '_'. strtolower ($ nom_classe [$ i]); // QUELLE ? –

Questions connexes