2009-10-19 12 views
27

manuale di PHP suggests alle classi autoload comeConverti CamelCase per under_score_case in php __autoload()

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

e questo approccio funziona bene per caricare classe FooClass salvato nel file my_dir/FooClass.php come

class FooClass{ 
    //some implementation 
} 

domanda

Come posso rendere possibile l'utilizzo diFunzionee accesso FooClass salvato nel file my_dir/foo_class.php?

risposta

68

si potrebbe convertire il nome di classe come questo ...

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

Questo non ha problemi con un nome di classe come * myClassName *? –

+0

Grazie per la risposta rikh, la tua magia funziona! @cballou, il codice funziona anche nel tuo caso. L'ho testato sui seguenti nomi di classe: FooClass, fooClass, myFooClass e MyFooClass. –

+0

@cballou, no, ogni volta che c'è una lettera minuscola seguita da una lettera maiuscola, viene inserito un trattino basso tra di loro. Infine, viene effettuata una chiamata a strtolower per garantire che il nome finale sia tutto in minuscolo. –

2

Questo non è testato, ma ho usato qualcosa di simile prima di convertire il nome della classe. Potrei aggiungere che la mia funzione viene eseguita anche in O (n) e non si basa su backreferencing lento.

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

Sarebbe più pulito se ti liberassi dei numeri magici e avessi usato qualcosa di più vicino a: if (ord ($ class_name [$ i])> = ord ('A ') && ord ($ class_name [$ i]) <= ord (' Z ')) { –

+1

Questo è vero, tuttavia stavo andando per l'ottimizzazione visto che altre due chiamate a ** ord() ** all'interno di un ciclo sarebbero state IMO leggermente eccessivo. –

+0

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