2009-10-19 6 views
27

manual de PHP suggests a clases de autocarga comoConvertir CamelCase para under_score_case en __autoload php()

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

y este enfoque funciona bien para cargar la clase FooClass guardada en el archivo my_dir/FooClass.php como

class FooClass{ 
    //some implementation 
} 

pregunta

¿Cómo puedo hacer posible el uso de _autoload() función y acceso FooClass guardado en el archivo my_dir/foo_class.php?

Respuesta

68

podría convertir el nombre de clase como esto ...

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

¿Esto no tendría problemas con un nombre de clase como * myClassName *? –

+0

Gracias por la respuesta rikh, ¡tu magia funciona! @cballou, el código también funciona en tu caso. Lo probé en los siguientes nombres de clase FooClass, fooClass, myFooClass y MyFooClass. –

+0

@cballou, no, cada vez que hay una letra minúscula seguida de una letra mayúscula, se inserta un guión bajo entre ellos. Finalmente, se realiza una llamada a strtolower para garantizar que el nombre final esté en minúsculas. –

2

Esto no se ha probado, pero he usado algo similar antes de convertir el nombre de la clase. Debo agregar que mi función también se ejecuta en O (n) y no se basa en la retroreferencia lenta.

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

Sería más claro si se deshiciera de los números mágicos y usara algo más cercano a: if (ord ($ class_name [$ i])> = ord ('A ') && ord ($ class_name [$ i]) <= ord (' Z ')) { –

+1

Esto es cierto, sin embargo yo estaba buscando la optimización ya que dos llamadas más a ** ord() ** dentro de un bucle serían un IMO ligeramente excesivo. –

+0

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

Cuestiones relacionadas