2009-10-19 2 views
27

PHP 수동 suggestsPHP __autoload()에서 CamelCase를 under_score_case로 변환하십시오.

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

와 같은 클래스를 자동로드하고이 클래스는 my_dir/FooClass.php와 같은 파일에 저장된 FooClass 클래스를로드 할 때 잘 동작합니다.

class FooClass{ 
    //some implementation 
} 

어떻게 만들 수 있습니까? _autoload() 함수를 사용하고 my_dir/foo_class.php 파일에 저장된 FooClass에 액세스 할 수 있습니까?

답변

68

당신은

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

* myClassName *과 같은 클래스 이름에 문제가 없습니까? –

+0

답변 주셔서 감사합니다 rikh, 당신의 마법 작품! @cballou, 코드는 귀하의 경우에도 작동합니다. FooClass, fooClass, myFooClass 및 MyFooClass라는 클래스 이름에서 테스트했습니다. –

+0

@cballou, 아니요, 소문자와 대문자가있을 때마다 그 사이에 밑줄이 삽입됩니다. 마지막으로 strtolower를 호출하여 최종 이름이 모두 소문자인지 확인합니다. –

2

이 안된 ... 같이 클래스 이름을 변환 할 수 있지만 클래스 이름을 변환하기 전에 나는 비슷한 사용했습니다. 나는 내 함수가 O (n)에서 실행되고 느린 역 참조에도 의존하지 않는다고 덧붙일 수있다.

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

매직 넘버를 없애고 더 가까운 것을 사용하면 더 깨끗합니다. if (ord ($ class_name [$ i])> ord ('A ') && ord ($ class_name [$ i]) <= ord ('Z ')) { –

+1

이것은 사실이지만 루프 내에서 ** ord() **에 대한 두 번 더 호출하면 최적화 할 것입니다. 약간 과도한 IMO. –

+0

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

관련 문제