บทนำสู่คำแนะนำมาตรฐาน 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 ก่อนที่จะใช้งานดังแสดงด้านล่าง

psr ภาพ 1

วิธีการข้างต้นทำให้เกิดปัญหาบางอย่างราวกับว่าเรามีคลาสภายนอกหลายสิบคลาสที่จะใช้ในไฟล์ และเราเริ่มเขียนบรรทัดของคำสั่ง require/include ที่จุดเริ่มต้นของไฟล์ต้นฉบับ

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

psr ภาพ2

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

psr_image3

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

การแนะนำ spl_autoload_register() ทำให้โปรแกรมเมอร์สามารถสร้าง autoload chain ซึ่งเป็นชุดของฟังก์ชันที่สามารถเรียกให้ลองโหลดคลาสหรืออินเทอร์เฟซได้

ตัวอย่างเช่น:

psr_image4psr_image5

การโหลดอัตโนมัติเป็นแนวคิดที่ยอดเยี่ยมที่ทุกโครงการเริ่มใช้งาน ทุกคนสร้างตัวโหลดอัตโนมัติในเวอร์ชันของตนเองอย่างหลีกเลี่ยงไม่ได้เนื่องจากขาดมาตรฐานที่เหมือนกัน เห็นได้ชัดว่า 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 โดยใช้ผู้แต่ง
psr_image6
  • สร้างไฟล์ composer.json โดยใช้ composer init หากไม่มี คุณสามารถสร้างด้วยตนเองได้ในรูทของโปรเจ็กต์ของคุณ
psr_image7
  • ตั้งค่าการโหลดอัตโนมัติ PSR4 โดยแก้ไขไฟล์ composer.json ดังที่แสดงด้านล่าง:
psr_image8
  • ที่นี่ CodeCourse เป็นชื่อผู้ขายของแอปพลิเคชันของคุณ คุณสามารถใช้ชื่อนี้ในขณะที่จัดไฟล์เนมสเปซภายในไดเร็กทอรี src ของคุณ เช่น:
    psr_image9

    หรือ

psr_image10

ฯลฯ

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

สร้าง AuthFilters.php ภายใน CodeCourse/Filters

psr_image11

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

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

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 เป็นต้น) แต่ไม่ควรทำทั้งสองอย่าง เช่น,
psr_image15

ตัวอย่างข้างต้นทำให้เกิดผลข้างเคียง กล่าวคือ การโหลดไฟล์ชื่อ “file.php”

  • ไฟล์ต้องอยู่ใน UTF-8 โดยไม่มี BOM (Byte Order Mark)
  • เนมสเปซและชื่อคลาสต้องเป็นไปตามมาตรฐานใน PSR-0 และ PSR-4

นี่คือตัวอย่างที่แสดงหลักการตั้งชื่อพื้นฐานสำหรับคุณสมบัติ คลาส และวิธีการ

psr_image16

PSR-2 (คู่มือรูปแบบการเข้ารหัส)

ภาพรวมของ PSR-2:

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

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

psr_image18

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

psr_image19

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

psr_image20

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

psr_image21

งบเงื่อนไข

  • คุณต้องใส่ช่องว่างก่อน (
  • คุณต้องไม่ใส่ช่องว่างหลัง (
  • คุณต้องไม่ใส่ช่องว่างใด ๆ ก่อน )
  • คุณต้องใส่ช่องว่างหลัง )
  • ใช้ elseif แทน else if

ตัวอย่างเพื่อแสดงความแตกต่างระหว่าง elseif และ else ถ้า:
การตีความของelseif:

psr_image22

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

psr_image23

สำหรับคำสั่งสวิตช์

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

ตัวอย่าง:

psr_image24