Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> PHP

Có thể lấy danh sách namespace đã định nghĩa trong PHP không?


Cho file 1 có namespace ns_1 và file 2 có namespace ns_2, nếu file 1 và file 2 được include trong file 3, không có cách nào biết rằng namespace ns_1 và ns_2 đã được nạp.

Cách duy nhất là dùng hàm class_exists và danh sách các class với namespace cụ thể có thể lấy bằng get_declared_classes. Nói đơn giản, dữ liệu này có thể dùng để tìm namespace khớp với tất cả tên class đã khai báo:

function namespaceExists($namespace) { 
    $namespace .= "\\"; 
    foreach(get_declared_classes() as $name) 
        if(strpos($name, $namespace) === 0) return true; 
    return false; 
}

----Hoặc----

Ví dụ

<?php 
namespace FirstNamespace; 
class new_class {} 
namespace SecondNamespace; 
class new_class {} 
namespace ThirdNamespace\FirstSubNamespace; 
class new_class {} 
namespace ThirdNamespace\SecondSubNamespace; 
class new_class {} 
namespace SecondNamespace\FirstSubNamespace; 
class new_class {} 
$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);

Kết quả

Array ( [FirstNamespace] => [SecondNamespace] => Array ( [FirstSubNamespace] => ) [ThirdNamespace] => Array ( [FirstSubNamespace] => [SecondSubNamespace] => ) )

Các namespace khác nhau được tạo (FirstNamespace, SecondNamespace...) và class rỗng được khai báo (new_class). Mảng namespace được tạo và vòng lặp foreach chạy qua các class đã khai báo. Khớp regex được thực hiện và các namespace được định nghĩa trong môi trường cụ thể sẽ hiển thị.