บทนำ
Namespaces ใน PHP ช่วยให้ Classes/Functions/Constants ชื่อเดียวกันใช้ร่วมกันได้ในบริบทต่างๆ โดยไม่ Conflict ทำงานเหมือนโฟลเดอร์ใน File System - ไฟล์ชื่อเดียวกันอยู่ได้ในโฟลเดอร์ต่างกัน คลาสชื่อเดียวกันอยู่ได้ใน Namespace ต่างกัน ต้องระบุ Full Name พร้อม Namespace เพื่อเข้าถึง
Namespaces สำคัญเมื่อโค้ดโตขึ้น การตั้งชื่อ Unique ให้ทุก Class/Function ยุ่งยาก Namespace ช่วยแก้ปัญหา 2 ข้อ:
- ป้องกัน Name Collisions - ระหว่างโค้ดของเรากับ Third-party Libraries
- Alias/Shorten ชื่อยาว - เพิ่ม Readability
PHP Namespaces จัดกลุ่ม Classes, Interfaces, Functions, Constants ที่เกี่ยวข้องกัน Namespace Names เป็น Case-insensitive
ตัวอย่างพื้นฐาน
<?php
namespace myspace;
function hello() {
echo "Hello World\n";
}
?>
การเรียกใช้ Function ใน Namespace
ใช้ use เพื่อ Import แล้ว Qualify ด้วย Namespace:
<?php
namespace myspace;
function hello() {
echo "Hello World\n";
}
use myspace;
myspace\hello();
?>
ผลลัพธ์
Hello World
Namespace แบบ Nested (Sub-namespaces)
<?php
namespace App\Controller;
class UserController { }
namespace App\Model;
class User { }
namespace App\Service;
class UserService { }
?>
การ Import แบบต่างๆ
<?php
// Import Class
use App\Controller\UserController;
use App\Controller\UserController as UC;
// Import Function
use function App\Helper\formatDate;
// Import Constant
use const App\Config\MAX_USERS;
// Group Use (PHP 7+)
use App\Controller\{UserController, PostController};
use function App\Helper\{formatDate, formatTime};
use const App\Config\{MAX_USERS, MIN_AGE};
?>
ข้อควรระวัง
- Namespace Declaration ต้องอยู่บรรทัดแรกหลัง
<?php(ยกเว้นdeclare) - ไม่สามารถ Wrap Namespace ใน Block ได้ (ยกเว้น Bracketed Syntax)
- Global Code (ไม่อยู่ใน Namespace) อยู่ใน Global Namespace
- ใช้
__NAMESPACE__Magic Constant เพื่อดู Current Namespace