บทนำสู่คำแนะนำมาตรฐาน PHP (PSR)
เผยแพร่แล้ว: 2019-12-24กาลครั้งหนึ่ง ในการประชุม หัวหน้านักพัฒนาจากกรอบงานที่เลือกได้นั่งลงในห้องเดียวกันและตกลงมาตรฐานบางอย่างสำหรับโครงการทั้งหมดของพวกเขาที่จะใช้ จุดมุ่งหมายคือทำให้ PHP framework และไลบรารี่ง่ายต่อการรวมสำหรับผู้ใช้ นั่นคือเมื่อ php-fig: PHP Framework Interop Group ถือกำเนิดขึ้น กลุ่มบุคคลที่ยอดเยี่ยมนี้ดูแล PHP Standards Recommendations (PSR)
คำแนะนำมาตรฐาน PHP (PSR) เป็นข้อกำหนด PHP ที่เผยแพร่โดย PHP Framework Interoperability Group (PHP-FIG) มันทำหน้าที่สร้างมาตรฐานของแนวคิดการเขียนโปรแกรมใน PHP จุดมุ่งหมายคือการเปิดใช้งานการทำงานร่วมกันของส่วนประกอบต่างๆ PHP-FIG ถูกสร้างขึ้นโดยผู้ก่อตั้งเฟรมเวิร์ก PHP หลายคน
PSR-0 & PSR-4
สิ่งเหล่านี้อธิบายข้อกำหนดสำหรับการโหลดคลาสอัตโนมัติจากพาธไฟล์ PSR-0 และ PSR-4 เป็นทั้งมาตรฐานที่เกี่ยวข้องกับเนมสเปซ ชื่อคลาส และพาธไฟล์ PSR นี้ยังอธิบายตำแหน่งที่จะวางไฟล์ที่จะโหลดอัตโนมัติตามข้อกำหนด
โหลดอัตโนมัติ
การโหลดอัตโนมัติเป็นฟังก์ชันที่ช่วยให้นักพัฒนารวมถึงคลาส PHP โดยอัตโนมัติโดยไม่ต้องเขียนคำสั่ง include/require ที่รก
ใน PHP คำจำกัดความของคลาสจะโหลดด้วยคำสั่ง require หรือ include ในไฟล์ที่เรียกว่า ie ก่อนที่จะใช้งานดังแสดงด้านล่าง

วิธีการข้างต้นทำให้เกิดปัญหาบางอย่างราวกับว่าเรามีคลาสภายนอกหลายสิบคลาสที่จะใช้ในไฟล์ และเราเริ่มเขียนบรรทัดของคำสั่ง require/include ที่จุดเริ่มต้นของไฟล์ต้นฉบับ
เพื่อแก้ปัญหานี้ PHP 5 ได้แนะนำฟังก์ชันมายากล __autoload() ซึ่งจะถูกเรียกโดยอัตโนมัติเมื่อโค้ดของคุณอ้างอิงถึงคลาสหรืออินเทอร์เฟซที่ยังไม่ได้โหลด

นี่คือตัวอย่างการใช้งาน __autoload() พื้นฐาน:

ข้อเสียเปรียบที่สำคัญของฟังก์ชัน __autoload() คือคุณสามารถจัดเตรียมตัวโหลดอัตโนมัติได้เพียงตัวเดียวเท่านั้น PHP 5.1.2 แนะนำฟังก์ชั่นการโหลดอัตโนมัติอื่น (spl_autoload_register) สำหรับการจัดการกับข้อ จำกัด ของ __autoload
การแนะนำ spl_autoload_register() ทำให้โปรแกรมเมอร์สามารถสร้าง autoload chain ซึ่งเป็นชุดของฟังก์ชันที่สามารถเรียกให้ลองโหลดคลาสหรืออินเทอร์เฟซได้
ตัวอย่างเช่น:


การโหลดอัตโนมัติเป็นแนวคิดที่ยอดเยี่ยมที่ทุกโครงการเริ่มใช้งาน ทุกคนสร้างตัวโหลดอัตโนมัติในเวอร์ชันของตนเองอย่างหลีกเลี่ยงไม่ได้เนื่องจากขาดมาตรฐานที่เหมือนกัน เห็นได้ชัดว่า PHP ต้องการมาตรฐานสำหรับตัวโหลดอัตโนมัติอย่างมาก ซึ่งเป็นที่มาของ PSR-0 มาตรฐานตัวโหลดอัตโนมัติที่ยอมรับล่าสุดคือ PSR-4
PSR-0 (มาตรฐานการโหลดอัตโนมัติ)
ภาพรวมของ PSR-0:
- เนมสเปซและคลาสที่มีคุณสมบัติครบถ้วนต้องมีโครงสร้าง
\<ชื่อผู้ขาย>\(<เนมสเปซ>\)*<ชื่อคลาส> - เนมสเปซแต่ละรายการต้องมีเนมสเปซระดับบนสุด ("ชื่อผู้ขาย")
- เนมสเปซแต่ละรายการสามารถมีเนมสเปซย่อยได้มากเท่าที่ต้องการ
- ตัวคั่นเนมสเปซแต่ละตัวจะถูกแปลงเป็น DIRECTORY_SEPARATOR เมื่อโหลดจากระบบไฟล์
- อักขระ _ แต่ละตัวใน CLASS NAME จะถูกแปลงเป็น DIRECTORY_SEPARATOR อักขระ _ ไม่มีความหมายพิเศษในเนมสเปซ
- เนมสเปซและคลาสที่มีคุณสมบัติครบถ้วนจะต่อท้ายด้วย .php เมื่อโหลดจากระบบไฟล์
- อักขระที่เป็นตัวอักษรในชื่อผู้ขาย เนมสเปซ และชื่อคลาสอาจเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ผสมกัน
ตัวอย่าง:
\Doctrine\Common\IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request =>
/path/to/project/lib/vendor/Symfony/Core/Request.php
PSR-4 (มาตรฐานการโหลดอัตโนมัติ)
ภาพรวมของ PSR-4:
- คำว่า "คลาส" หมายถึงคลาส ส่วนต่อประสาน คุณลักษณะและโครงสร้างอื่นที่คล้ายคลึงกัน
- ชื่อคลาสที่มีคุณสมบัติครบถ้วนมีรูปแบบดังต่อไปนี้:
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName> - ชื่อคลาสที่มีคุณสมบัติครบถ้วนต้องมีชื่อเนมสเปซระดับบนสุด หรือที่เรียกว่า “เนมสเปซผู้ขาย”
- ชื่อคลาสแบบเต็มอาจมีชื่อย่อยเนมสเปซตั้งแต่หนึ่งชื่อขึ้นไป
- ชื่อคลาสที่มีคุณสมบัติครบถ้วนต้องมีชื่อคลาสที่สิ้นสุด
- ขีดล่างไม่มีความหมายพิเศษในส่วนใด ๆ ของชื่อคลาสที่มีคุณสมบัติครบถ้วน
- อักขระที่เป็นตัวอักษรในชื่อคลาสแบบเต็มอาจเป็นการผสมผสานระหว่างตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
- ชื่อคลาสทั้งหมดต้องถูกอ้างอิงแบบคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
ตัวอย่างสำหรับการโหลดอัตโนมัติแบบ PSR-4 โดยใช้ Composer:
- พิจารณาโครงสร้างไดเร็กทอรีต่อไปนี้เพื่อให้เกิดการโหลดอัตโนมัติตาม PSR-4 โดยใช้ผู้แต่ง

- สร้างไฟล์ composer.json โดยใช้ composer init หากไม่มี คุณสามารถสร้างด้วยตนเองได้ในรูทของโปรเจ็กต์ของคุณ

- ตั้งค่าการโหลดอัตโนมัติ PSR4 โดยแก้ไขไฟล์ composer.json ดังที่แสดงด้านล่าง:

- ที่นี่ CodeCourse เป็นชื่อผู้ขายของแอปพลิเคชันของคุณ คุณสามารถใช้ชื่อนี้ในขณะที่จัดไฟล์เนมสเปซภายในไดเร็กทอรี src ของคุณ เช่น:

หรือ


ฯลฯ
- และ src คือไดเร็กทอรีของแอปพลิเคชันที่คุณต้องการโหลดอัตโนมัติ
- ถัดไป เปิดเทอร์มินัลของคุณและพิมพ์คำสั่งต่อไปนี้เพื่อติดตั้งไฟล์ autoloading ในโครงการของคุณ ซึ่งจะสร้างไดเร็กทอรี vendor และไฟล์ autoload.php ข้างใน

- ขั้นแรก มาสร้างคลาสสองสามคลาสภายในไดเร็กทอรี CodeCourse
สร้าง AuthFilters.php ภายใน CodeCourse/Filters

สร้าง UserRepository.php ภายใน CodeCourse/Repositories

- สุดท้าย ให้สร้างไฟล์ index.php เพื่อทดสอบ และจำเป็นต้องใช้ไฟล์ autoload.php ครั้งเดียวในไฟล์ index.php ของคุณ

PSR-1 & PSR-2
PSR-1 และ PSR-2 มีประโยชน์สำหรับมาตรฐานการเข้ารหัส PHP PSR-1 มุ่งเน้นไปที่มาตรฐานการเข้ารหัสพื้นฐานสำหรับ PHP เป็นหลัก ในขณะที่ PSR-2 นั้นเหมือนกับ PSR-1 เวอร์ชันขยายมากกว่า PSR-1 แสดงรายการชุดของกฎง่ายๆ สำหรับการตั้งชื่อแบบแผนการตั้งชื่อ และ PSR-2 จะจัดเตรียมคู่มือรูปแบบการเข้ารหัสที่ครอบคลุมมากขึ้น
PSR-1 (มาตรฐานการเข้ารหัสพื้นฐาน)
ภาพรวมของ PSR-1:
- อนุญาตให้ใช้เฉพาะ <?php หรือ <?= สำหรับแท็ก PHP เท่านั้น
- ต้องกำหนดชื่อคลาสใน UpperCamelCase
- ต้องกำหนดตัวแปรคลาสใน camelCase
- ต้องกำหนดค่าคงที่ของคลาสใน UPPER_SNAKE_CASE
- ต้องกำหนดชื่อเมธอดใน camelCase
- ไฟล์ควรประกาศสัญลักษณ์ (คลาส ฟังก์ชัน ค่าคงที่ ฯลฯ) หรือทำให้เกิดผลข้างเคียง (เช่น สร้างเอาต์พุต เปลี่ยนการตั้งค่า .ini เป็นต้น) แต่ไม่ควรทำทั้งสองอย่าง เช่น,

ตัวอย่างข้างต้นทำให้เกิดผลข้างเคียง กล่าวคือ การโหลดไฟล์ชื่อ “file.php”
- ไฟล์ต้องอยู่ใน UTF-8 โดยไม่มี BOM (Byte Order Mark)
- เนมสเปซและชื่อคลาสต้องเป็นไปตามมาตรฐานใน PSR-0 และ PSR-4
นี่คือตัวอย่างที่แสดงหลักการตั้งชื่อพื้นฐานสำหรับคุณสมบัติ คลาส และวิธีการ

PSR-2 (คู่มือรูปแบบการเข้ารหัส)
ภาพรวมของ PSR-2:
- คุณต้องปฏิบัติตามมาตรฐานการเข้ารหัส PSR-1
- ต้องใช้ช่องว่าง 4 ช่องสำหรับการเยื้อง ไม่อนุญาตให้ใช้แท็บ
- ไม่มีการจำกัดความยาวบรรทัด แต่ควรมีความยาวไม่เกิน 120 อักขระ และดีที่สุดหากต่ำกว่า 80
- ต้องมีบรรทัดว่างหนึ่งบรรทัดหลังการประกาศเนมสเปซ และต้องมีบรรทัดว่างหนึ่งบรรทัดหลังการประกาศบล็อกการใช้งาน
- การเปิดวงเล็บปีกกาสำหรับคลาสและเมธอดต้องอยู่ในบรรทัดถัดไป และวงเล็บปีกกาปิดต้องอยู่ในบรรทัดต่อจากส่วนเนื้อหา
- ต้องกำหนดวิธีการและคุณสมบัติด้วย abstract/final ก่อน ตามด้วย public/protected และสุดท้าย static keyword
- คุณต้องไม่ขึ้นบรรทัดใหม่ก่อนวงเล็บปีกกาในคำสั่งแบบมีเงื่อนไข
- คุณต้องไม่เว้นวรรคก่อน ( และ ) ในคำสั่งแบบมีเงื่อนไข
- ตัวอย่างสำหรับการกำหนดคลาส:
- คุณต้องเปิดวงเล็บปีกกาบนบรรทัดใหม่ และต้องใช้คีย์เวิร์ดส่วนขยายและการใช้ในบรรทัดเดียว

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

ตัวอย่างเพื่อแสดงวิธีการกำหนดใน PHP:
ขณะกำหนดวิธีการ อาร์กิวเมนต์ควรเขียนในบรรทัดเดียวกัน นอกจากนี้ คุณต้องไม่ใส่ช่องว่างใด ๆ ก่อนเครื่องหมายจุลภาคในอาร์กิวเมนต์ และคุณต้องใส่ช่องว่างหลังเครื่องหมายจุลภาค

หากมีข้อโต้แย้งจำนวนมาก สามารถเขียนขึ้นบรรทัดใหม่ได้ทีละข้อ:

เมื่อกำหนดเมธอด คุณต้องมีแบบใดแบบหนึ่งแบบสาธารณะ/มีการป้องกัน/ส่วนตัวและแบบนามธรรม/ขั้นสุดท้าย โหมดการมองเห็นจะอยู่หลังคำสำคัญ abstract/final หากใช้ คงที่เป็นตัวแก้ไขสุดท้าย

งบเงื่อนไข
- คุณต้องใส่ช่องว่างก่อน (
- คุณต้องไม่ใส่ช่องว่างหลัง (
- คุณต้องไม่ใส่ช่องว่างใด ๆ ก่อน )
- คุณต้องใส่ช่องว่างหลัง )
- ใช้ elseif แทน else if
ตัวอย่างเพื่อแสดงความแตกต่างระหว่าง elseif และ else ถ้า:
การตีความของelseif:

การตีความอื่น ๆ ถ้า:

สำหรับคำสั่งสวิตช์
- วงเล็บปีกกาต้องเปิดในบรรทัดเดียวกับที่เขียนคำสั่ง switch
- ตัวเคสต้องเยื้องจากเคสหนึ่งครั้งและเคสจะต้องเยื้องจากสวิตช์หนึ่งครั้ง
- ใช้ no break เมื่อไม่ต้องการ break
- คุณสามารถใช้ return แทน break ได้
ตัวอย่าง:
