Computer >> Máy Tính >  >> Lập trình >> PHP

Có thể lấy danh sách các không gian tên được xác định trong PHP không

Cho trước tệp 1 có không gian tên ns_1 và tệp 2 có không gian tên ns_2, nếu tệp 1 và tệp 2 được bao gồm trong tệp 3, không có cách nào để biết rằng không gian tên ns_1 và ns_2 đã được tải.

Cách duy nhất là sử dụng hàm ‘class_exists’ và danh sách các lớp với không gian tên cụ thể có thể được lấy bằng cách sử dụng ‘get_declared_classes’. Nói một cách đơn giản, dữ liệu thu được này có thể được sử dụng để tìm một không gian tên phù hợp với tất cả các tên lớp đã 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);

Đầu ra

Điều này sẽ tạo ra kết quả sau -

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

Các không gian tên khác nhau được tạo (FirstNamespace, SecondNamespace ..) và khai báo lớp trống (new_class). Một mảng không gian tên được tạo và một vòng lặp foreach chạy qua các lớp được khai báo. Đối sánh biểu thức chính quy được thực hiện và không gian tên được xác định trong môi trường cụ thể đó sẽ được hiển thị.