ฟังก์ชันสำหรับโหลดคลาสอัตโนมัติใน OOP PHP ด้วยตัวเอง
บ่อยครั้งที่ระบบโหลดอัตโนมัติมาตรฐานอาจไม่เหมาะกับคุณด้วยเหตุผลบางประการ ในกรณีเช่นนี้ คุณสามารถเขียนระบบโหลดอัตโนมัติของคุณเองได้
เพื่อทำสิ่งนี้ คุณต้องส่งผ่านฟังก์ชัน callback ที่คุณเขียนเป็นพารามิเตอร์แรกให้กับฟังก์ชัน spl_autoload_register ฟังก์ชันนี้จะถูกเรียกใช้เมื่อ PHP ตรวจพบการอ้างอิงถึงคลาสที่ยังไม่ได้โหลด ชื่อคลาสพร้อมกับเนมสเปซจะถูกส่งเข้ามาในพารามิเตอร์ของฟังก์ชันนี้:
<?php
spl_autoload_register(function($class) {
// ในตัวแปร $class จะมีชื่อคลาสพร้อมกับเนมสเปซ
});
?>
และหน้าที่ของฟังก์ชันคือการโหลดคลาสนั้นผ่าน require โดยใช้ชื่อคลาส นั่นคือภายในฟังก์ชันนี้เราต้องกำหนดกฎของเราเองสำหรับการโหลดคลาส นั่นคือข้อตกลงการตั้งชื่อของเราเอง
ลองเขียนตัวอย่างระบบโหลดอัตโนมัติของเราดู สมมติว่าเรากำหนดว่าเส้นทางไปยังไฟล์คลาสจากรูทของเว็บไซต์จะเหมือนกับเนมสเปซ แต่จะรักษาระบบตัวพิมพ์ (case) ไว้
นั่นคือ หากเรามีคลาส Core\Admin\PageController แล้ว เส้นทางไปยังคลาสควรเป็น Core/Admin/PageController.php
อย่างที่คุณเห็น การแปลงชื่อคลาสพร้อมเนมสเปซของมัน แค่ต้องเปลี่ยนแบ็กสแลชเป็นฟอร์เวิร์ดสแลช และเพิ่ม .php ต่อท้ายชื่อคลาส ลองทำดู:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
อย่างไรก็ตาม เราจะได้เส้นทางไปยังไฟล์แบบสัมพัทธ์ (สัมพันธ์กับรูทของเว็บไซต์) ควรทำให้เป็นเส้นทางแบบสมบูรณ์ (absolute path) แบบนี้ดีกว่า:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
ยังมีรายละเอียดอีก ในระบบปฏิบัติการต่าง ๆ เส้นทางผ่านโฟลเดอร์อาจใช้ฟอร์เวิร์ดสแลชหรือแบ็กสแลช ทำให้โค้ดของเราไม่ขึ้นกับระบบปฏิบัติการ เพื่อทำสิ่งนี้ แทนที่จะใช้ฟอร์เวิร์ดสแลชสำหรับแยกเส้นทาง เราจะใช้ค่าคงที่ DIRECTORY_SEPARATOR ซึ่งมีสแลชที่ถูกต้องสำหรับระบบปฏิบัติการที่สคริปต์ของเรากำลังทำงานอยู่ ในที่สุดเราจะได้โค้ดต่อไปนี้:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
ลองทดสอบฟังก์ชันโหลดอัตโนมัติที่ฉันสร้างขึ้น
คิดค้นกฎการโหลดอัตโนมัติของคุณเองและนำไปปฏิบัติ