Autoloader PSR-4
สำหรับ PSR-4 นี้ จะมีเนื้อหาที่เกี่ยวข้องกันกับ PSR-0 ว่าด้วยเรื่องของ Namspaces และประโยชน์ของมันในการใช้งาน autoloader โดยที่ตามมาตรฐาน PSR ได้มีการประกาศยกเลิก PSR-0 ไปแล้ว
สำหรับมาตรฐานนี้เกี่ยวข้องกันกับ classes, interfaces, traits และอื่นๆที่มีโครงสร้างคล้ายกัน
autoload จะทำหน้าที่ในการ include ไฟล์โดยอัตโนมัติเมื่อมีการเรียกใช้งานคลาส โดยที่ไม่จำเป็นต้องโหลดคลาสเตรียมไว้ก่อน เป็นการประหยัดหน่วยความจำและช่วยให้เว็บไซต์โหลดได้เร็วขึ้น
สำหรับมาตรฐานนี้เกี่ยวข้องกันกับ classes, interfaces, traits และอื่นๆที่มีโครงสร้างคล้ายกัน
- การประกาศชื่อคลาสมีรูปแบบเต็มๆคือ
<\NamespacesName>(<\SubNamespaceNames>)*\<ClassName> - การประกาศคลาสจะต้องประกอบด้วย NamespacesName ในอันดับแรกสุดเสมอ โดยทั่วไปจะใช้รายการนี้เป็นชื่อผู้แต่ง (Vender)
- การประกาศคลาสจะมี SubNamespaceNames หรือไม่ก็ได้
- และในการประกาศคลาส จะต้องมี ClassName เสมอ
- ชื่อคลาสอยู่ในรูปแบบ CarmelCase คือ ขึ้นต้นด้วยตัวพิมพ์ใหญ่ ตามด้วยตัวพิมพ์เล็ก และ เชื่อมแต่ละคำโดยไม่มีอักขระใดๆคั่น
- ชื่อคลาสทั้งหมดต้องสามารถสื่อความหมายได้ ว่าคลาสนี้ใช้ทำอะไร
- การประกาศชื่อคลาสทั้งหมดควรสามารถอ้างอิงไปยังไดเร็คทอรี่ได้ เพื่อใช้งานร่วมกับ autoloader ในการโหลดคลาสขึ้นมาใช้งาน เมื่อมีการเรียกใช้คลาสเท่านั้น เช่น
Vender\Controllers\DefaultController
หมายถึงคลาสคอนโทรลเลอร์หลัก ของ Vender ซึ่งมีที่อยูไฟล์แบบเต็มๆคือ
/vender/controllers/defaultcontroller.php - ในการใช้งาน autoloader ต้องไม่ส่งออกข้อความผิดพลาดใดๆ หากการประกาศคลาสไม่สำเร็จ
/**
* โหลดคลาสโดยอัตโนมัติตามชื่อของ 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 ไฟล์โดยอัตโนมัติเมื่อมีการเรียกใช้งานคลาส โดยที่ไม่จำเป็นต้องโหลดคลาสเตรียมไว้ก่อน เป็นการประหยัดหน่วยความจำและช่วยให้เว็บไซต์โหลดได้เร็วขึ้น