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ị.