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

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


ถ้าไฟล์ 1 มี namespace ns_1 และไฟล์ 2 มี namespace ns_2 หากไฟล์ 1 และ 2 ถูก include ในไฟล์ 3 ไม่มีทางรู้ว่า namespace ns_1 และ ns_2 ถูกโหลดแล้ว

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

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] => ) )

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