GORAGOD.com

Autoloader PSR-4

สำหรับ PSR-4 นี้ จะมีเนื้อหาที่เกี่ยวข้องกันกับ PSR-0 ว่าด้วยเรื่องของ Namspaces และประโยชน์ของมันในการใช้งาน autoloader โดยที่ตามมาตรฐาน PSR ได้มีการประกาศยกเลิก PSR-0 ไปแล้ว

สำหรับมาตรฐานนี้เกี่ยวข้องกันกับ classes, interfaces, traits และอื่นๆที่มีโครงสร้างคล้ายกัน
  • การประกาศชื่อคลาสมีรูปแบบเต็มๆคือ
    <\NamespacesName>(<\SubNamespaceNames>)*\<ClassName>
     
  • การประกาศคลาสจะต้องประกอบด้วย NamespacesName ในอันดับแรกสุดเสมอ โดยทั่วไปจะใช้รายการนี้เป็นชื่อผู้แต่ง (Vender)
  • การประกาศคลาสจะมี SubNamespaceNames หรือไม่ก็ได้
  • และในการประกาศคลาส จะต้องมี ClassName เสมอ
  • ชื่อคลาสอยู่ในรูปแบบ CarmelCase คือ ขึ้นต้นด้วยตัวพิมพ์ใหญ่ ตามด้วยตัวพิมพ์เล็ก และ เชื่อมแต่ละคำโดยไม่มีอักขระใดๆคั่น
  • ชื่อคลาสทั้งหมดต้องสามารถสื่อความหมายได้ ว่าคลาสนี้ใช้ทำอะไร
  • การประกาศชื่อคลาสทั้งหมดควรสามารถอ้างอิงไปยังไดเร็คทอรี่ได้ เพื่อใช้งานร่วมกับ autoloader ในการโหลดคลาสขึ้นมาใช้งาน เมื่อมีการเรียกใช้คลาสเท่านั้น เช่น
    Vender\Controllers\DefaultController
     
    หมายถึงคลาสคอนโทรลเลอร์หลัก ของ Vender ซึ่งมีที่อยูไฟล์แบบเต็มๆคือ
    /vender/controllers/defaultcontroller.php
     
  • ในการใช้งาน autoloader ต้องไม่ส่งออกข้อความผิดพลาดใดๆ หากการประกาศคลาสไม่สำเร็จ
ตัวอย่างการใช้งาน autoload
/**
 * โหลดคลาสโดยอัตโนมัติตามชื่อของ Classname เมื่อมีการเรียกใช้งานคลาส
 *
 * @param string $className
 *
 * @return void
 */

function autoload($className) {
    $className = str_replace('\', '/', strtolower($className));
    if (preg_match('/^gcms\/([a-z]+)\/([a-z]+)\/([a-z]+)/i', $className, $match) && is_file(APP_PATH.'modules/'.$match[1].'/'.$match[3].'s/'.$match[2].'.php')) {
        include APP_PATH.'modules/'.$match[1].'/'.$match[3].'s/'.$match[2].'.php';
    } elseif (preg_match('/^gcms\/([\a-z0-9]+)/i', $className, $match) && is_file(ROOT_PATH.$match[1].'.php')) {
        include ROOT_PATH.$match[1].'.php';
    } elseif (preg_match('/[\a-z0-9]+/i', $className) && is_file(ROOT_PATH.$className.'.php')) {
        include ROOT_PATH.$className.'.php';
    }
}
spl_autoload_register('autoload');
 
autoload จะทำหน้าที่ในการ include ไฟล์โดยอัตโนมัติเมื่อมีการเรียกใช้งานคลาส โดยที่ไม่จำเป็นต้องโหลดคลาสเตรียมไว้ก่อน เป็นการประหยัดหน่วยความจำและช่วยให้เว็บไซต์โหลดได้เร็วขึ้น