นอกเหนือจากคำนำหน้า: คู่มือนักพัฒนา WordPress สำหรับเนมสเปซ PHP

เผยแพร่แล้ว: 2019-11-12

คำนำหน้าทุกอย่าง

เป็นสุภาษิตที่เก่าพอ ๆ กับซอฟต์แวร์ WordPress เอง คำนำหน้าเป็นมาตรฐานสำหรับนักพัฒนา WordPress มาเป็นเวลานานจนยากที่จะจินตนาการว่าจะทำอะไรที่แตกต่างออกไป แต่ถึงเวลาแล้วสำหรับสิ่งใหม่ มันผ่านไปนานแล้ว แต่ WordPress ล้าหลังเล็กน้อยในแนวปฏิบัติมาตรฐานในโลก PHP ที่ใหญ่กว่า

คำนำหน้าเป็นแนวทางปฏิบัติในการสร้างชื่อโปรเจ็กต์ของคุณในเวอร์ชันที่เป็นมิตรกับโค้ดและนำหน้าไปไว้ข้างหน้าฟังก์ชัน คลาส และสิ่งอื่น ๆ ในเนมสเปซส่วนกลาง ตัวอย่างเช่น คุณจะต้องตั้งชื่อฟังก์ชัน tavern_get_post() แทน get_post get_post() เพื่อหลีกเลี่ยงความขัดแย้งของชื่อฟังก์ชัน ซึ่งจะส่งผลให้เกิดข้อผิดพลาดร้ายแรง

คำนำหน้าเป็นรูปแบบหนึ่งของ "เนมสเปซ" ซึ่งเป็นวิธีแฟนซีในการบอกว่าชื่อในพื้นที่นี้เป็นของโปรเจ็กต์เฉพาะ อย่างไรก็ตาม คำนำหน้า (และคำต่อท้าย ซึ่งไม่ค่อยเกิดขึ้น) เป็นการแฮ็กตั้งแต่สมัยที่ไม่มีวิธีแก้ปัญหาสำหรับภาษา PHP

PHP 5.3 แนะนำวิธีการเนมสเปซอย่างเป็นทางการ มาตรฐานจึงมีมาหลายปีแล้ว เนื่องจาก WordPress 5.2 ได้เพิ่มข้อกำหนด PHP ขั้นต่ำเป็น 5.6 จึงถึงเวลาแล้วที่นักพัฒนาจะต้องเลิกนิสัยเดิมๆ และไล่ตามโลก PHP ที่เหลือ

เนมสเปซ (เกือบ) ทุกอย่าง

เนมสเปซ PHP ครอบคลุมเฉพาะรายการต่อไปนี้

  • ชั้นเรียน
  • อินเทอร์เฟซ
  • ลักษณะนิสัย
  • ฟังก์ชั่น
  • ค่าคงที่ประกาศด้วยคีย์เวิร์ด const แต่ไม่ได้ define()

เมื่อพูดถึงตัวจัดการสคริปต์ ชื่อขนาดรูปภาพ ตัวเลือกฐานข้อมูล และรายการอื่นๆ ในเนมสเปซส่วนกลาง คุณยังต้องนำหน้าชื่อเหล่านั้น สิ่งเหล่านี้คือ ID และอยู่นอกขอบเขตของเนมสเปซ PHP

วิธีสร้างเนมสเปซ

Namespaces นั้นง่ายต่อการประกาศ ที่ด้านบนสุดของไฟล์ PHP ใดๆ ที่คุณต้องการใช้เนมสเปซเฉพาะ ให้ประกาศตามที่แสดงในข้อมูลโค้ดต่อไปนี้

 <?php

เนมสเปซโรงเตี๊ยม;

สิ่งที่โค้ดบรรทัดนี้ทำคือการประกาศว่าทุกอย่างในไฟล์นี้มีเนมสเปซของ Tavern

ดูฟังก์ชันอย่างง่ายภายใต้เนมสเปซนั้นเพื่อส่งออก Hello, World! ข้อความ.

 <?php

เนมสเปซโรงเตี๊ยม;

ฟังก์ชั่นสวัสดี () {
    _e( 'สวัสดี ชาวโลก!', 'โดเมนข้อความตัวอย่าง' );
}

หากทำตามกฎของคำนำหน้าแบบเก่า hello() จะถูกตั้งชื่อว่า tavern_hello() อย่างไรก็ตาม นั่นไม่ใช่กรณีที่มีเนมสเปซ ฟังก์ชัน hello() ถูกห่อหุ้มไว้ภายในเนมสเปซ Tavern และจะไม่ขัดแย้งกับฟังก์ชันอื่นๆ ที่ชื่อว่า hello()

คลาสและอินเทอร์เฟซทำงานเหมือนกับฟังก์ชัน ด้วยชื่อคลาสของ Article ไฟล์คลาสอาจมีลักษณะดังนี้

 <?php

เนมสเปซโรงเตี๊ยม;

บทความในชั้นเรียน {
    // ...
}

หมายเหตุ: ควรมีเพียงหนึ่งคลาสหรืออินเทอร์เฟซต่อไฟล์ นี่เป็นสิ่งสำคัญอย่างยิ่งหากคุณเคยวางแผนที่จะใช้ตัวโหลดอัตโนมัติ

วิธีตั้ง ชื่อ เนมสเปซ

นักพัฒนาชอบโต้เถียงกันว่าจะตั้งชื่อสิ่งต่าง ๆ อย่างไร และไม่มีวิธีแก้ปัญหาแบบเดียว กฎที่สำคัญที่สุดคือต้องไม่ซ้ำกันเพื่อหลีกเลี่ยงการขัดแย้งกับโค้ดจากโครงการอื่น วิธีหนึ่งที่ดีที่สุดในการทำเช่นนี้คือการใช้เนมสเปซ Vendor ระดับบนสุดกับเนมสเปซย่อยของ Package

สมมติว่าเนมสเปซของผู้ขายคือ Tavern และโครงการที่เป็นปัญหาคือธีม WordPress ชื่อ News เนมสเปซสำหรับโปรเจ็กต์อาจมีลักษณะดังนี้

 <?php

เนมสเปซโรงเตี๊ยม\ข่าว;

นั่นอาจจะละเอียดไปหน่อยสำหรับนักพัฒนาบางคน หากชื่อโครงการของคุณค่อนข้างไม่ซ้ำกันอยู่แล้ว เช่น “Awesomesauce” คุณอาจต้องการใช้สิ่งต่อไปนี้

 <?php

เนมสเปซ Awesomesauce;

คุณจะต้องคิดแบบแผนมาตรฐานขึ้นมา อย่างน้อยก็สำหรับตัวคุณเอง ในที่สุด คุณจะต้องการเข้าสู่สิ่งต่าง ๆ เช่นการโหลดอัตโนมัติ ดังนั้นการมีระบบที่คุณติดตามในโครงการทั้งหมดของคุณจะช่วยได้ อย่าลังเลที่จะอ่านมาตรฐาน PHP-FIG Autoloader

การนำเข้าคลาสและฟังก์ชันไปยังเนมสเปซอื่น

เมื่อคุณจำเป็นต้องใช้คลาสหรือฟังก์ชันจากเนมสเปซที่แตกต่างจากเนมสเปซปัจจุบัน คุณจะต้องนำเข้ามา ทำได้โดย use คีย์เวิร์ด use ใน PHP

คำสั่ง use ต้องมาหลังการประกาศ namespace นอกจากนี้ยังควรอ้างอิงชื่อคลาสที่มีคุณสมบัติครบถ้วน รหัสต่อไปนี้นำเข้าคลาส Tavern\Helpers\Post ไปยังไฟล์ที่มีเนมสเปซอื่น

 <?php

เนมสเปซ โรงเตี๊ยม\Template;

ใช้โรงเตี๊ยม\Helpers\Post;

เมื่อนำเข้าแล้ว คุณจะปลอดภัยที่จะใช้คลาส Post โดยตรงตามที่แสดงในตัวอย่างถัดไป

 $post = โพสต์ใหม่ ();

สำหรับ PHP 5.6 คุณยังสามารถนำเข้าฟังก์ชันและค่าคงที่จากเนมสเปซอื่นๆ โดย use function use และ use const ตามลำดับ บล็อกโค้ดต่อไปนี้สาธิตวิธีการนำเข้าทั้งฟังก์ชันและค่าคงที่

 <?php

เนมสเปซ โรงเตี๊ยม\Template;

ใช้ฟังก์ชัน Tavern\Helpers\func_name;
ใช้ const Tavern\Helpers\CONSTANT_NAME;

คลาสนามแฝงและฟังก์ชัน

ในที่สุด คุณจะเจอสถานการณ์ที่คุณต้องนำเข้าคลาสหรือฟังก์ชันที่มีชื่อเดียวกับคลาสหรือฟังก์ชันภายในเนมสเปซปัจจุบัน คุณอาจกำลังคิดว่านี่คือปัญหาที่เนมสเปซตั้งใจจะแก้ไข โชคดีที่ PHP มีวิธีการสร้างนามแฝงในการนำเข้า

สมมติว่าคุณมีคลาสชื่อ Tavern\User และจำเป็นต้องใช้อินเทอร์เฟซ Tavern\Contracts\User เมื่อนำเข้าอินเทอร์เฟซ คุณจะต้องสร้างนามแฝงดังที่แสดงด้านล่าง

 <?php

เนมสเปซโรงเตี๊ยม;

ใช้ Tavern\Contracts\User เป็น UserContract;

คลาสผู้ใช้ใช้ UserContract {
    // ...
}

as UserContract ต่อท้ายคำสั่ง use จะสร้างนามแฝงสำหรับอินเทอร์เฟซ User คุณสามารถใช้ชื่อ UserContract ใหม่ได้อย่างปลอดภัยโดยไม่มีข้อผิดพลาด

คลาส อินเตอร์เฟส ฟังก์ชัน และค่าคงที่ทั้งหมดเป็นไปตามวิธีการเดียวกันสำหรับการสร้างนามแฝง

การจัดระเบียบโครงสร้างโฟลเดอร์ตามเนมสเปซ

เป็นแนวปฏิบัติมาตรฐานในโลก PHP ที่กว้างขึ้นสำหรับเนมสเปซและโครงสร้างไฟล์และโฟลเดอร์ของโปรเจ็กต์เพื่อให้ตรงกัน การทำเช่นนี้ทำให้นักพัฒนารายอื่นสามารถค้นหาโค้ดภายในโครงการของคุณได้อย่างง่ายดาย นอกจากนี้ยังทำให้ง่ายต่อการสร้างตัวโหลดอัตโนมัติสำหรับการโหลดคลาสตามต้องการ

โดยทั่วไป โค้ด PHP ทั้งหมดควรอยู่ในโฟลเดอร์ /src , /inc หรือชื่อที่คล้ายกันในโครงการของคุณ ตัวอย่างไฟล์ปลั๊กอินและโครงสร้างโฟลเดอร์อาจมีลักษณะดังนี้

 /ชื่อปลั๊กอิน
    /src
        /แกน
            /Activate.php
            /Setup.php
        /ดู
            /Post.php
            /Page.php

หากใช้โครงสร้างเดียวกันกับเนมสเปซ ไฟล์ .php ด้านบนจะมีคลาสต่อไปนี้

  • Tavern\Core\Activate
  • Tavern\Core\Setup
  • Tavern\View\Post
  • Tavern\View\Page

โปรดทราบว่าชื่อไฟล์และโฟลเดอร์ต้องตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ และควรตรงกับเนมสเปซและชื่อคลาสทุกประการ

แน่นอน คุณมีอิสระที่จะปฏิบัติตามข้อตกลงใดๆ ที่คุณต้องการ อย่างไรก็ตาม คำแนะนำก่อนหน้านี้เป็นแนวปฏิบัติที่ดีและจะทำให้วิธีการจัดระเบียบโครงการของคุณในระยะยาวง่ายขึ้น

ประโยชน์ของการใช้เนมสเปซ

ประโยชน์ที่ชัดเจนที่สุดคือเพื่อหลีกเลี่ยงการปะทะกันระหว่างคลาสและฟังก์ชันที่มีชื่อเดียวกัน คุณควรใช้เนมสเปซจริงด้วยเหตุผลเดียวกับที่คุณใช้คำนำหน้า

เนมสเปซช่วยหลีกเลี่ยงชื่อคลาสที่ยาว การพิมพ์ชื่อยาวๆ ตลอดทั้งโปรเจ็กต์ขนาดใหญ่เป็นแนวทางปฏิบัติที่น่าเบื่อที่สุด

สลับการใช้งานได้ง่ายขึ้นโดยการนำเข้า เมื่อคุณคุ้นเคยกับการนำเข้าคลาสและอินเทอร์เฟซจากเนมสเปซอื่นแล้ว คุณสามารถเปลี่ยนการใช้งานอินเทอร์เฟซด้วยโค้ดบรรทัดเดียวได้

คลาสการโหลดอัตโนมัติจะง่ายกว่ามากหากคุณปฏิบัติตามมาตรฐาน PSR-4: Autoloader ซึ่งต้องมีเนมสเปซระดับบนสุดเป็นอย่างน้อย

สำหรับนักพัฒนาในพื้นที่ระดับมืออาชีพ คุณจะได้รับทักษะทางการตลาดที่เหนือกว่าระบบนิเวศของ WordPress คุณจะถูกกดดันอย่างหนักเพื่อค้นหางานพัฒนา PHP หากคุณไม่ทราบวิธีใช้เนมสเปซ ไม่ใช่แนวคิดที่เข้าใจยาก แต่อาจมีช่วงการเรียนรู้สำหรับบางคนในทางปฏิบัติ