elephantNamespaces

อริศรา ทรัพย์คูณ 640710587

Namespaces คืออะไร

ใน PHP นั้น Namespaces ถูกออกแบบมาเพื่อแก้ปัญหาสองอย่าง ได้แก่

  1. การชนกันของชื่อระหว่างโค้ดที่เราสร้างเองและคลาส/ฟังก์ชัน/ค่าคงที่ภายใน PHP หรือคลาส/ฟังก์ชัน/ค่าคงที่ของบุคคลที่สาม

  2. ความสามารถในการใช้นามแฝง ซึ่งออกแบบมาเพื่อแก้ไขปัญหาแรกและทำให้การอ่านโค้ดสะดวกขึ้น

ประโยชน์ของ 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

circle-info

การประกาศ 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-87c751fc8f73arrow-up-right

Namespaces คืออะไร, ตัวอย่างในหัวข้อการประกาศ namespace

PHP.net. (ม.ป.ป.). Namespaces overview. PHP.net.https://www.php.net/manual/en/language.namespaces.rationale.phparrow-up-right

ประโยชน์ของ Namespaces

TutorialsPoint. (ม.ป.ป.). PHP - namespaces. TutorialsPoint. https://www.tutorialspoint.com/php/php_namespaces.htmarrow-up-right

Last updated