บทนำ
สามารถประกาศ Multiple Namespaces ในไฟล์ .php เดียวได้ 2 วิธี:
- Combination Syntax - ต่อกันโดยไม่มี Braces
- Bracketed Syntax - ใช้ Curly Braces กำหนดขอบเขต
1. Combination Syntax
ประกาศ Namespace ติดกัน Resources ใน Namespace แรกใช้ได้จนกว่าจะเจอ Declaration ตัวถัดไป ใช้ use เพื่อทำให้ Namespace ไหนเป็น Current:
<?php
namespace myspace1;
function hello() {
echo "Hello World from space1\n";
}
echo "myspace1: ";
hello();
namespace myspace\space2;
function hello() {
echo "Hello World from space2\n";
}
echo "myspace2: ";
hello();
use myspace1;
hello(); // เรียก myspace1\hello()
use myspace2;
hello(); // เรียก myspace2\hello()
?>
ผลลัพธ์
myspace1: Hello World from space1 myspace2: Hello World from space2 Hello World from space2 Hello World from space2
2. Bracketed Syntax (แนะนำ)
ใช้ Curly Braces กำหนด Scope ชัดเจน:
<?php
namespace myspace1 {
function hello() {
echo "Hello World from space1\n";
}
echo "myspace1: ";
hello();
}
namespace myspace\space2 {
function hello() {
echo "Hello World from space2\n";
}
echo "myspace2: ";
hello();
}
?>
ผลลัพธ์
myspace1: Hello World from space1 myspace2: Hello World from space2
ข้อแนะนำและข้อจำกัด
- แนะนำ Bracketed Syntax - อ่านง่าย Scope ชัดเจน
- ห้ามผสมผสาน Bracketed และ Unbracketed ในไฟล์เดียวกัน
- Global Code - นอก Braces ได้แค่
declarestatement เท่านั้น - รวม Global + Named Namespace - ต้องใช้ Bracketed Syntax เท่านั้น
ตัวอย่าง Global + Named (Bracketed Only)
<?php
namespace {
// Global code
function globalFunc() { echo "Global\n"; }
}
namespace MyApp {
function appFunc() { echo "App\n"; }
globalFunc(); // เรียก Global Function
}
?>
Best Practice
ในโปรเจกต์จริง ควร 1 File = 1 Namespace = 1 Class ตาม PSR-4 ใช้ Composer Autoloader ไม่ควรใส่ Multiple Namespaces ในไฟล์เดียวกัน