ใน /system/codeigniter/CodeIgniter.php จะมีทางแยกระหว่าง php4 กับ php5 อยู่ ซึ่ง php4 จะโหลดคลาส Loader ขึ้นมาก่อนและโหลดคลาส CI_Base (ใน /system/codeigniter/Base4.php) ซึ่งจะสืบทอด (extends) จาก CI_Loader ตรงนี้จึงเป็นจุดบอดเวลาที่เราต้องการจะเขียนคลาส MY_Loader เพื่อใช้งาน เพราะ Base4 มันเขียนไว้ว่ายังไงก็จะสืบถอดจาก CI_Loader ให้ได้ซะอย่างงั้น
ผมพยายามหาทางออก ที่จะไม่ต้องแก้ไขตัว Core ของ CodeIgniter แต่ก็จนปัญหาครับ. จริงๆ แล้วมันมีอยู่อีกแบบนึงคือ เขียน CI_Loader ขึ้นมาใหม่เองทั้งหมด (แบบที่ Matchbox ทำ) แล้ววางไว้ที่ /system/application/libraries/Loader.php แต่ก็ดูจะผิดจุดประสงค์ไปหน่อยครับ เพราะว่า MY_Loader ของผมต้องการจะต่อเติม หรือแก้ไขเฉพาะบาง method ที่อยู่ใน CI_Loaderเท่านั้น.
สุดท้ายก็ต้องตัดสินใจแก้ที่ Core ของมันครับ ที่จะแก้คือไฟล์ /system/codeigniter/Base4.php ครับ
จากเดิม
class CI_Base extends CI_Loader { function CI_Base() { // This allows syntax like $this->load->foo() to work parent::CI_Loader(); $this->load =& $this; // This allows resources used within controller constructors to work global $OBJ; $OBJ = $this->load; // Do NOT use a reference. } }
เปลี่ยนเป็น
if (class_exists( config_item('subclass_prefix')."Loader" )) { eval(' class CI_Base extends '.config_item('subclass_prefix')."Loader".' { function CI_Base() { // This allows syntax like $this->load->foo() to work parent::'.config_item('subclass_prefix')."Loader".'(); $this->load =& $this; // This allows resources used within controller constructors to work global $OBJ; $OBJ = $this->load; // Do NOT use a reference. } } '); } else { class CI_Base extends CI_Loader { function CI_Base() { // This allows syntax like $this->load->foo() to work parent::CI_Loader(); $this->load =& $this; // This allows resources used within controller constructors to work global $OBJ; $OBJ = $this->load; // Do NOT use a reference. } } }
แค่นี้ก็จะสามารถใช้งาน MY_Loader ได้แล้วล่ะครับ