2009-10-19 23 views
27

PHP thủ suggests đến các lớp học autoload nhưChuyển đổi CamelCase để under_score_case trong php __autoload()

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

và phương pháp này hoạt động tốt để nạp lớp FooClass lưu trong tập tin my_dir/FooClass.php như

class FooClass{ 
    //some implementation 
} 

Câu hỏi

Tôi làm cách nào để có thể sử dụngChức năngvà truy cập FooClass được lưu trong tập tin my_dir/foo_class.php?

Trả lời

68

Bạn có thể chuyển đổi tên lớp như thế này ...

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

Điều này không có vấn đề gì với tên lớp như * myClassName *? –

+0

Cảm ơn câu trả lời của Rikh, các tác phẩm ma thuật của bạn! @cballou, mã cũng hoạt động trong trường hợp của bạn. Tôi đã thử nghiệm nó trên các tên lớp sau đây FooClass, fooClass, myFooClass và MyFooClass. –

+0

@cballou, nope, mỗi lần có một chữ cái viết thường thấp hơn theo sau là một chữ hoa, một dấu gạch dưới được chèn vào giữa chúng. Cuối cùng, một cuộc gọi đến strtolower được thực hiện để đảm bảo tên cuối cùng là tất cả các trường hợp thấp hơn. –

2

Đây là chưa được kiểm tra nhưng tôi đã sử dụng một cái gì đó tương tự trước để chuyển đổi tên lớp. Tôi có thể thêm rằng chức năng của tôi cũng chạy trong O (n) và không phụ thuộc vào chậm backreferencing.

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

Nó sẽ được sạch hơn nếu bạn đã loại bỏ các số ma thuật và sử dụng một cái gì đó gần hơn với: if (ord ($ class_name [$ i])> = ord ('A ') && ord ($ class_name [$ i]) <= ord (' Z ')) { –

+1

Điều này đúng, tuy nhiên tôi đã tối ưu hóa khi có thêm hai cuộc gọi đến ** ord() ** trong vòng lặp sẽ là IMO hơi quá mức. –

+0

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

Các vấn đề liên quan