2011-08-11 25 views
12

Có thể lấy danh sách tất cả các lớp/không gian tên đã nhập trong tệp PHP, trong ngữ cảnh hiện tại không?PHP5: nhận danh sách không gian tên đã nhập

Ví dụ:

namespace A; 
use B, C\D; 

Tôi muốn để có được mảng này:

array('B', 'C\D'); 

Lý do là tôi đang xây dựng một Registry Mapper, và tôi muốn để có thể để truy vấn trình ánh xạ này bằng tên lớp bí danh trong ngữ cảnh hiện tại và không có tên đầy đủ.

Ví dụ:

$registry->getMapper('D'); 

Thay vì:

$registry->getMapper('C\D'); 

Và nếu có thể, tôi muốn không để hardcode các bí danh, nếu có một cách để có được chúng tự động từ PHP!

Trả lời

5
+0

Điều đó giống như một cách hợp lý để đạt được mục tiêu, và từ một thư viện được duy trì tốt như Doctrine Common. Cảm ơn! – Benjamin

3

Điều này đã được thảo luận gần đây trên danh sách gửi thư của PHP Internals. Câu trả lời ngắn gọn (như tôi hiểu) là không. http://marc.info/?l=php-internals&m=130815747804590&w=2

+0

Cảm ơn bạn, như đã nói trong câu trả lời Ernesta, tôi đang cố gắng lấy giá trị 'use'. Tôi hiểu rằng thông tin này có thể chỉ hữu ích cho trình phân tích cú pháp, nhưng tôi hy vọng rằng thông tin này có thể được cung cấp cho động cơ. – Benjamin

0

Cách duy nhất để làm như vậy, trên __construct chính của bạn(), đọc thư mục lớp học, cho tất cả các tệp php có sẵn cho không gian tên. (PHP Manual: glob() - Answer 101017).

+0

Cảm ơn bạn, thực sự tôi không tìm cách để có được các vùng tên được định nghĩa, mà là để có được các câu lệnh 'use'. – Benjamin

+0

Sau đó viết một chức năng cho nó gọi người dùng và đăng ký yêu cầu của bạn. –

0

Câu trả lời đầu cho câu hỏi này: is it possible to get list of defined namespaces

Có một số mã rất tiện dụng mà có thể liệt kê tất cả không gian tên:

$namespaces=array(); 
    foreach(get_declared_classes() as $name) { 
     if(preg_match_all("@[^\\\]+(?=\\\)@iU", $name, $matches)) { 
      $matches = $matches[0]; 
      $parent =&$namespaces; 
      while(count($matches)) { 
       $match = array_shift($matches); 
       if(!isset($parent[$match]) && count($matches)) 
        $parent[$match] = array(); 
       $parent =&$parent[$match]; 

      } 
     } 
    } 

    print_r($namespaces); 
+0

Điều này trả về danh sách các không gian tên cho tất cả các lớp được khai báo, trong khi câu hỏi là làm thế nào để trả về * đã nhập * các không gian tên trong tệp * current *. Rất khác nhau! – Benjamin

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