Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

เป็นไปได้ไหมที่จะรับรายการเนมสเปซที่กำหนดใน PHP


ไฟล์ที่กำหนด 1 มีเนมสเปซ ns_1 และไฟล์ 2 มีเนมสเปซ ns_2 หากไฟล์ 1 และไฟล์ 2 รวมอยู่ในไฟล์ 3 จะไม่มีทางทราบได้ว่ามีการโหลดเนมสเปซ ns_1 และ ns_2 แล้ว

วิธีเดียวคือใช้ฟังก์ชัน 'class_exists' และรายการของคลาสที่มีเนมสเปซเฉพาะสามารถรับได้โดยใช้ 'get_declared_classes' พูดง่ายๆ ก็คือ ข้อมูลที่ได้รับนี้สามารถใช้เพื่อค้นหาเนมสเปซที่ตรงกันตามชื่อคลาสที่ประกาศไว้ทั้งหมด -

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

----หรือ---

ตัวอย่าง

<?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);

ผลลัพธ์

สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -

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

มีการสร้างเนมสเปซที่แตกต่างกัน (FirstNamespace, SecondNamespace..) และมีการประกาศคลาสว่าง (new_class) มีการสร้างอาร์เรย์ของเนมสเปซและลูป foreach ทำงานผ่านคลาสที่ประกาศ การจับคู่นิพจน์ทั่วไปเสร็จสิ้นและเนมสเปซที่กำหนดไว้ในสภาพแวดล้อมเฉพาะนั้นจะปรากฏขึ้น