บทนำ
การปรากฏของ Namespace ในโค้ด PHP จะถูก Resolve ตามกฎต่อไปนี้:
กฎการ Resolve
- Unqualified Name (ไม่มี Separator) - หมายถึง Current Namespace เช่น
ClassNameใน namespaceA\Bจะ resolve เป็นA\B\ClassName - Qualified Name (มี Separator) - เช่น
myspace\space1Resolve เป็น Sub-namespacespace1ภายใต้myspace(Relative) - Fully Qualified Name (ขึ้นต้น \) - เช่น
\myspaceหรือ\myspace\space1Resolve เป็น Absolute Namespace - Fully Qualified Names Resolve เป็น Absolute Namespace ตรงๆ เช่น
\myspace\space1→myspace\space1 - Global Namespace Prefix - ถ้าอยู่ใน Global Namespace
namespace\space1resolve เป็นspace1 - Inside Another Namespace - ถ้า
namespace\space1อยู่ในmyspaceจะเทียบเท่าmyspace\space1 - Import Table (use statements) - Segment แรกของ Qualified Name จะถูก Translate ตาม Import Table ของ Class/Namespace
- No Import Rule - Current Namespace จะถูก Prepend เข้าไป
- แยกตามประเภท - Class-like names ใช้ Class Import Table, Functions ใช้ Function Import Table, Constants ใช้ Constant Import Table
- Unqualified Function/Constant - ถ้าไม่มี Import Rule และอยู่นอก Global Namespace จะ Resolve ที่ Runtime: หาใน Current Namespace ก่อน แล้วค่อยหา Global Function
ตัวอย่างการ Resolve
<?php namespace A\B; use C\D as E; use function F\G as funcG; use const H\I as CONST_I; // Class resolution new E(); // → C\D (จาก use) new \E(); // → E (Global - fully qualified) new C\D(); // → C\D (qualified - relative to current? No, first segment checked in imports) new A\B\C(); // → A\B\C (qualified) // Function resolution funcG(); // → F\G (จาก use function) \funcG(); // → funcG (global) G\funcG(); // → G\funcG (qualified) // Constant resolution echo CONST_I; // → H\I (จาก use const) echo \CONST_I; // → CONST_I (global) echo I\CONST_I; // → I\CONST_I (qualified) ?>
สรุปลำดับความสำคัญ
- Fully Qualified Name (ขึ้นต้น \) - Highest Priority
- Import Statements (use)
- Current Namespace (สำหรับ Unqualified)
- Global Namespace (Fallback สำหรับ Functions/Constants)