Namespaces
อริศรา ทรัพย์คูณ 640710587
Namespaces คืออะไร
ใน PHP นั้น Namespaces ถูกออกแบบมาเพื่อแก้ปัญหาสองอย่าง ได้แก่
การชนกันของชื่อระหว่างโค้ดที่เราสร้างเองและคลาส/ฟังก์ชัน/ค่าคงที่ภายใน PHP หรือคลาส/ฟังก์ชัน/ค่าคงที่ของบุคคลที่สาม
ความสามารถในการใช้นามแฝง ซึ่งออกแบบมาเพื่อแก้ไขปัญหาแรกและทำให้การอ่านโค้ดสะดวกขึ้น
ประโยชน์ของ Namespaces
ช่วยหลีกเลี่ยงการชนกันของชื่อระหว่างคลาส/ฟังก์ชัน/ค่าคงที่ที่ตัวเรากำหนดเองหรือคลาส/ฟังก์ชัน/ค่าคงที่ที่กำหนดโดยบุคคลที่สาม
สามารถใช้นามแฝงหรือย่อชื่อให้สั้นลง เพื่อทำให้การอ่านโค้ดสะดวกขึ้น
จัดกลุ่มคลาส, อินเตอร์เฟส, ฟังก์ชัน และค่าคงที่ที่เกี่ยวข้องกัน ชื่อของ Namespace ไม่คำนึงถึงตัวพิมพ์ใหญ่-พิมพ์เล็ก
การประกาศ namespace
Namespaces จะถูกประกาศไว้ที่ตอนต้นของไฟล์ด้วย keyword ว่า namespace
Syntax
ประกาศ namespace ที่ชื่อว่า Html:
<?php
namespace Html;
?>ตัวอย่าง:
รายละเอียดของโค้ด:
คำสั่ง namespace ใช้เพื่อประกาศให้ทุกสิ่งที่อยู่ในไฟล์นี้ (คลาส, ฟังก์ชัน, และคงค่า) อยู่ใน namespace MyProject
ช่วยป้องกันการชนกันของชื่อหากมีคลาสหรือฟังก์ชันที่ชื่อเหมือนกันในโปรเจกต์อื่นที่ใช้งานร่วมกัน
คงค่า CONNECT_OK ให้มีค่าเป็น 1 ด้วยคำสั่ง const
อยู่ภายใต้ namespace MyProject ดังนั้นหากจะใช้งานใน namespace อื่น จะต้องอ้างอิงผ่าน MyProject\CONNECT_OK
คลาส Connection ถูกประกาศไว้ใน namespace MyProject
คลาสนี้อาจใช้เพื่อจัดการการเชื่อมต่อ เช่น ฐานข้อมูล แม้ว่าเนื้อหาในคลาสจะยังไม่ได้ถูกระบุในโค้ดนี้
หากต้องการใช้งานคลาสนี้ใน namespace อื่น ต้องอ้างอิงแบบเต็ม เช่น MyProject\Connection
ฟังก์ชัน connect ถูกประกาศไว้ใน namespace MyProject
ฟังก์ชันนี้อาจใช้สำหรับการสร้างการเชื่อมต่อกับบางสิ่ง เช่น ฐานข้อมูล หรือ API แม้ว่าจะยังไม่มีการกำหนดรายละเอียดในฟังก์ชัน
หากจะใช้งานใน namespace อื่น จะต้องอ้างอิงแบบเต็ม เช่น MyProject\connect
การประกาศ namespace ใน PHP จะต้องเป็นสิ่งแรกในไฟล์ PHP นั้น ๆ หากมีโค้ดหรือคำสั่งอื่น ๆ มาก่อนหน้านั้น จะทำให้โค้ดนั้นไม่ถูกต้อง
ตัวอย่างที่ 1:
ตัวอย่างที่ 2:
ค่าคงที่ (constants), คลาส (classes), และฟังก์ชัน (functions) ที่ประกาศในไฟล์นี้จะเป็นของ namespace ที่ชื่อว่า Html:
ตัวอย่างการสร้างคลาสชื่อว่า Table ภายใน namespace ที่ชื่อ Html
รายละเอียดของโค้ด:
กำหนด namespace ว่าโค้ดนี้อยู่ใน namespace ที่ชื่อว่า Html เพื่อป้องกันการซ้ำของชื่อคลาสหรือฟังก์ชันเมื่อโปรเจกต์ใหญ่ขึ้น
สร้างคลาสที่ชื่อ Table โดยมีคุณสมบัติ 2 อย่าง คือ
public $title = ""; ชื่อของตาราง เริ่มต้นเป็นค่าว่าง
public $numRows = 0; จำนวนแถวของตาราง เริ่มต้นเป็น 0
message(): เป็น method ที่จะแสดงข้อความว่า "Table '[title]' has [numRows] rows." ในรูปแบบ HTML
สร้างอ็อบเจ็กต์จากคลาส Table และกำหนดให้ title เป็น "My table" และ numRows เป็น 5
ในส่วนนี้เป็นโครงสร้าง HTML ปกติที่มีการใช้ PHP ฝังอยู่เพื่อแสดงผล และเรียกใช้เมธอด message() ของอ็อบเจ็กต์ $table เพื่อแสดงผลข้อความ
ผลลัพธ์:
นอกจากนี้ เรายังสามารถซ้อน (nested) namespace ได้ โดยการประกาศ namespace หนึ่งอยู่ภายใน namespace อื่น
Syntax
ประกาศ namespace ที่ชื่อ Html ภายใน namespace ที่ชื่อ Code:
ตัวอย่าง:
รายละเอียดของโค้ด:
คำสั่ง namespace ใช้เพื่อประกาศให้ทุกสิ่งที่อยู่ในไฟล์นี้ (คลาส, ฟังก์ชัน, และคงค่า) อยู่ภายใต้ namespace ที่มีชื่อว่า MyProject\Sub\Level
โครงสร้าง namespace แบบนี้ช่วยให้สามารถจัดระเบียบโค้ดได้ดีขึ้น โดยสามารถจัดกลุ่มฟังก์ชันและคลาสที่มีความสัมพันธ์กัน
คงค่า CONNECT_OK ให้มีค่าเป็น 1 ด้วยคำสั่ง const
คงค่านี้อยู่ภายใต้ namespace MyProject\Sub\Level ดังนั้นถ้าต้องการใช้งานใน namespace อื่น ต้องอ้างอิงผ่าน MyProject\Sub\Level\CONNECT_OK
คลาส Connection ถูกประกาศไว้ใน namespace MyProject\Sub\Level
คลาสนี้สามารถใช้เพื่อจัดการการเชื่อมต่อกับบริการต่าง ๆ เช่น ฐานข้อมูล หรือ API เนื้อหาภายในคลาสยังไม่ได้ระบุในโค้ดนี้
หากต้องการใช้งานคลาสนี้ใน namespace อื่น ต้องอ้างอิงแบบเต็ม เช่น
MyProject\Sub\Level\Connection
ฟังก์ชัน connect ถูกประกาศไว้ใน namespace MyProject\Sub\Level
ฟังก์ชันนี้อาจใช้สำหรับการสร้างการเชื่อมต่อกับบางสิ่ง (เช่น ฐานข้อมูล หรือ API) แต่เนื้อหาในฟังก์ชันยังไม่ได้ถูกระบุ
หากต้องการเรียกใช้ฟังก์ชันนี้ใน namespace อื่น ต้องอ้างอิงแบบเต็ม เช่น MyProject\Sub\Level\connect
การใช้ Namespaces
โค้ดใดก็ตามที่ตามหลังการประกาศ namespace จะทำงานภายใน namespace นั้น ดังนั้นคลาสที่อยู่ภายใน namespace นั้นสามารถถูกสร้างอินสแตนซ์ (instantiated) ได้โดยไม่ต้องมีตัวระบุเพิ่มเติม (qualifiers) แต่ถ้าต้องการเข้าถึงคลาสจากภายนอก namespace จะต้องใส่ชื่อ namespace นำหน้าคลาสนั้นด้วย
ตัวอย่างการใช้ classes จาก namespace ที่ชื่อ Html
เมื่อมีการใช้งานคลาสหลาย ๆ คลาสจาก namespace เดียวกันพร้อมกัน การใช้คำสั่ง namespace จะทำให้โค้ดดูเรียบง่ายขึ้น เพราะไม่จำเป็นต้องระบุชื่อ namespace นำหน้าคลาสที่เราจะใช้งาน
ตัวอย่างการใช้คลาสจาก namespace ที่ชื่อ Html โดยไม่ต้องใช้ตัวระบุ Html\
การตั้งนามแฝงให้กับ Namespace
โดยใช้คำสั่ง use เพื่อกำหนด alias ให้กับ namespace นั้น ทำให้การเขียนโค้ดสะดวกยิ่งขึ้น
ตัวอย่างการตั้งนามแฝงให้กับ namespace
ตัวอย่างการตั้งนามแฝงให้กับคลาส
เปรียบเทียบกับภาษา Java, C, Python
ใน PHP การใช้ namespace ช่วยให้สามารถจัดกลุ่มของฟังก์ชัน, คลาส หรือคงค่าต่างๆ เพื่อป้องกันการชนกันของชื่อ
การประกาศ: ใช้คำสั่ง namespace เพื่อสร้าง namespace
การอ้างอิง: อ้างอิงคลาสหรือฟังก์ชันผ่านการใช้ชื่อเต็ม หรือใช้ use เพื่อลดการพิมพ์ชื่อเต็ม
ใน Java การใช้ namespace ทำผ่านการจัดการ package ซึ่งเป็นวิธีจัดโครงสร้างของคลาสเพื่อป้องกันการชนกันของชื่อ
การประกาศ: ใช้ package เพื่อกำหนด namespace ให้กับคลาส
การอ้างอิง: ใช้ import เพื่ออ้างอิงคลาสจากแพ็คเกจอื่น
ใน C ไม่มี namespace โดยตรง แต่สามารถใช้ struct, enum, และ prefix เพื่อเลี่ยงการชนกันของชื่อได้
การเลี่ยงการชนกันของชื่อ: ใช้ prefix เช่น MyNamespace_ เพื่อแยกแยะฟังก์ชันหรือ struct
ใน Python ใช้ module และ package เพื่อจัดการ namespace โดยธรรมชาติ
การประกาศ: ใช้ไฟล์ Python เป็น module โดยอัตโนมัติถือเป็น namespace
การอ้างอิง: ใช้ import เพื่อนำคลาสหรือฟังก์ชันจาก module อื่นมาใช้งาน
Video Presentation
.
Presentation Slides
.
References
เนื้อหาในหัวข้อการประกาศ namespace, การใช้ Namespaces, การตั้งนามแฝงให้กับ Namespace
W3Schools. (ม.ป.ป.). PHP namespaces. W3School.https://www.w3schools.com/php/php_namespaces.asp?goalId=39e3a5c1-4d5a-49b2-a0bc-87c751fc8f73
Namespaces คืออะไร, ตัวอย่างในหัวข้อการประกาศ namespace
PHP.net. (ม.ป.ป.). Namespaces overview. PHP.net.https://www.php.net/manual/en/language.namespaces.rationale.php
ประโยชน์ของ Namespaces
TutorialsPoint. (ม.ป.ป.). PHP - namespaces. TutorialsPoint. https://www.tutorialspoint.com/php/php_namespaces.htm
Last updated