คู่มือการใช้งาน CodeIgniter เวอร์ชั่น 1.7.2


สร้างคลาสไลบรารี่ของคุณเอง

เมื่อไรที่ผมพูดถึง "ไลบรารี่" ผมหมายถึงคลาสที่อาศัยอยู่ในไดเรคทอรี่ libraries และถูกอธิบายอยู่ในเอกสารอ้างอิงคลาส. ในกรณีนี้เราจะอธิบายวิธีการสร้างไลบรารี่ของคุณเองโดยอยู่ในไดเรคทอรี่ application/libraries โดยทำการแยกระหว่างไลบรารี่ที่ใช้เฉพาะแอพพลิเคชั่นกับไลบรารี่ที่ถูกใช้ทั่วเฟรมเวิร์ค

เพิ่มเติม CodeIgniter ยินยอมให้ไลบรารี่ของคุณสามารถขยาย (extend) มาจากคลาสพื้นฐานที่มีให้ ถ้าคุณต้องการเพิ่มฟังก์ชั่นบางอย่างลงไปในไลบรารี่ที่มีอยู่แล้ว หรือคุณสามารถที่จะแทนที่ไลบรารี่พื้นฐานได้โดยใช้ชื่อของคลาสที่ต้องการจะแทนที่ลงไปในโฟลเดอร์ application/libraries

หมายเหตุ : การวางแยกระหว่าง 2 โฟลเดอร์แท้จริงแล้ว เพื่อให้รู้ว่าไลบรารี่ที่เราทำเองหรือไปทับนั้นจะทำงานเฉพาะแอพพลิเคชั่นตัวเดียวหรือทุกๆแอพพลิเคชั่น ที่อยู่ในระบบเลย โดยถ้าอยู่ภายใน application/libraries นั้นก็จะใช้ได้เฉพาะแอพพลิเคชั่นนั้น แต่ถ้าเป็นโฟลเดอร์ libraries นั้นหมายถึงทุกๆแอพพลิเคชั่น

ข้อสรุป:

ในหน้าด่านล่างนี้จะเป็นการอธิบายแนวคิด 3 อย่างแบบละเอียด

หมายเหตุ: คลาสฐานข้อมูล (Database Class) ไม่สามารถถูกขยายหรือแทนที่ได้ด้วยคลาสของคุณหรือคลาส Loader ใน PHP 4 ส่วนที่เหลือสามารถขยายหรือแทนที่ได้

สถานที่เก็บ

คลาสไลบรารี่ของคุณควรถูกเก็บไว้ในโฟลเดอร์ application/libraries ในที่ๆ CodeIgniter จะมองหาเมื่อระบบเริ่มต้น

ข้อตกลงการตั้งชื่อ

หมายเหตุ: สิ่งที่ผมมักจะผิดอยู่บ่อยๆก็คือการตั้งชื่อคลาสเป็น MyClass แบบนี้ซึ่งผิดนะครับ ระวังตรงส่วนนี้ด้วย

ไฟล์คลาส

คลาสควรมีฐานต้นแบบเป็นดังนี้ (หมายเหตุ: เรากำลังใช้ชื่อ Someclass เป็นตัวอย่าง):

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    function some_function()
    {
    }
}

?>

ใช้คลาสของคุณ

จากที่ไหนก็ได้ภายในฟังก์ชั่น ตัวควบคุม (Controller) คุณสามารถเริ่มเรียกคลาสของคุณตามปกติ$this->load->library('someclass');

โดย someclass คือชื่อไฟล์ที่ไม่มีนามสกุล ".php" คุณสามารถใส่ชื่อไฟล์เป็นตัวใหญ่ทั้งหมดหรือเล็กทั้งหมด CodeIgniter ไม่สนใจ

เมื่อคุณโหลดมาแล้ว คุณสามารถใช้งานคลาสของคุณโดยตอนนี้เป็นรูปแบบ อักษรพิมพ์เล็ก

$this->someclass->some_function();  // ออบเจ็คที่ถูกสร้างขึ้นจะเป็นตัวพิมพ์เล็กเสมอ

ส่งพารามิเตอร์เมื่อจะโหลดคลาส

ในฟังก์ชั่นโหลดไลบรารี่คุณสามารถส่งข้อมูลอะไรก็ได้ผ่านทางพารามิเตอร์ที่สองและมันจะถูกส่งไปยังตัวสร้างคลาส (class constructor) :

$params = array('type' => 'large', 'color' => 'red');

$this->load->library('Someclass', $params);

ถ้าคุณใช้คุณสมบัตินี้คุณจะต้องเตรียมตัวสร้างคลาสของคุณรองรับกับการส่งข้อมูล:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    function Someclass($params)
    {
        // Do something with $params
    }
}

?>

คุณสามารถเก็บค่าพารามิเตอร์ไว้ในไฟล์ config ได้โดยสร้างไฟล์ config ขึ้นมาโดยใช้ ชื่อไฟล์ของคลาส ที่ต้องการและเก็บมันไว้ในโฟลเดอร์ application/config/ ของคุณ. สังเกตุว่าถ้าคุณใส่พารามิเตอร์แบบไดนามิคอย่างด้านบน ในกรณีนี้จะใช้แบบ config ไฟล์ไม่ได้

ใช้ประโยชน์จากทรัพยากร CodeIgniter กับไลบรารี่ของคุณ

การเข้าถึงทรัพยากรพื้นฐานของ CodeIgniter ด้วยไลบรารี่ของคุณนั้นจะต้องใช้ฟังก์ชั่น get_instance() โดยฟังก์ชั่นนี้จะเป็นการคืนค่า "CodeIgniter super object"

โดยปกติแล้วภายในฟังก์ชั่นตัวควบคุม (controller) ของคุณจะเรียกฟังก์ชั่นอะไรที่สามารถใช้ได้ก็จะต้องใช้ผ่าน $this

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.

$this, อย่างไรก็ตามสามารถใช้ได้เพียงเวลาที่อยู่ในตัวควบคุม(controller) , แบบจำลอง (model) หรือส่วงแสดง (view) เท่านั้น ถ้าคุณต้องการจะใช้คลาสของ CodeIgniter ภายในคลาสของคุณนั้นจะต้องเรียกตามแบบนี้:

ขั้นแรก, กำหนดค่าออบเจ็ค CodeIgniter ไปยังตัวแปร

$CI =& get_instance();

เมื่อคุณกำหนดค่าไปยังตัวแปรแล้ว คุณจะต้องใช้มันแทนคำว่า $this:

$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.

หมายเหตุ: คุณจะสังเกตุได้ว่าฟังก์ชั่น get_instance() จะถูกส่งไปแบบใช้ตำแหน่งอ้างอิง (pass by reference):

$CI =& get_instance();

เรื่องนี้เป็นเรื่องสำคัญมาก. การกำหนดค่าแบบอ้างอิงจะยอมให้คุณใช้ออบเจ็ค CodeIgniter จากต้นฉบับแทนที่จะเป็นตัวสำเนาของมัน

เช่นเดียวกันโปรดสังเกตุว่า : ถ้าคุณใช้ PHP 4 ควรจะหลีกเลี่ยงการเรียก get_instance() จากตัวสร้างคลาสของคุณ. PHP 4 มีปัญหาการอ้างอิงกับ "CI super object" ตั้งแต่ตัวสร้างแอพพลิเคชั่นหรือออบเจ็ค จนกว่าคลาสจะถูกสร้างขึ้นเสร็จอย่างสมบูรณ์

แทนที่ไลบรารี่พื้นฐานด้วยแบบฉบับของคุณ

ง่ายๆโดยตั้งชื่อคลาสของคุณให้เหมือนคลาสพื้นฐานจะทำให้ CodeIgniter ใช้มันแทนตัวพื้นฐาน การจะใช้คุณสมบัตินี้คุณจะต้องตั้งชื่อไฟล์และคลาสเหมือนกับคลาสพื้นฐานตัวอย่างเช่น การแทนที่ไลบรารี่ Email พื้นฐานคุณจะต้องสร้างไฟล์ชื่อ application/libraries/Email.php, และประกาศคลาสดังนี้

class CI_Email {

}

สังเกตุว่าคลาสพื้นฐานส่วนมากจะมีคำนำหน้าเป็น CI_.

การโหลดไลบรารี่ของคุณนั้นจะไม่แตกต่างกับการโหลดแบบปกติ

$this->load->library('email');

อย่าลืม: ในตอนนี้คลาสฐานข้อมูล (Database Class) ยังไม่สามารถถูกแทนที่ด้วยแบบฉบับของคุณได้.

ขยายไลบรารี่พื้นฐาน

ถ้าความต้องการทั้งหมดของคุณต้องการเพิ่มฟังก์ชั่นบางอย่างให้กับไลบรารี่ที่มีอยู่แล้ว - บางทีอาจจะเพิ่มสักหนึ่งหรือสองฟังก์ชั่น - ดังนั้นมันเป็นการมากเกินไปที่จะแทนที่ไลบรารี่ทั้งหมดด้วบแบบฉบับของคุณ ในกรณีี้นี้มันเป็นการดีกว่าที่คุณเพียงขยายคลาสเท่านั้น การขยายคลาสใกล้เคียงกับการแทนที่คลาสซึ่งมาพร้อมกับข้อยกเว้นบางอย่าง

ยกตัวอย่างเช่น, ในการที่จะขยายคลาส Email พื้นฐานคุณจะต้องสร้างไฟล์ชื่อ application/libraries/MY_Email.php, และประกาศคลาสแบบนี้

class MY_Email extends CI_Email {

}

หมายเหตุ: ถ้าคุณต้องการใช้ตัวสร้างคลาสภายในคลาสของคุณ ให้แน่ใจว่าคุณขยายมาจากตัวสร้างคลาสพ่อแม่:

class MY_Email extends CI_Email {

    function My_Email()
    {
        parent::CI_Email();
    }
}

การโหลดคลาสรองของคุณ

การจะโหลดคลาสรอง คุณจะสามารถที่จะใช้ตามมาตรฐานปกติ โดยไม่ต้องใส่คำนำหน้าของคุณ โดยตัวอย่างนี้จะเป็นการโหลดตัวอย่างด้านบนซึ่งขยายมาจากคลาสอีเมล์ (Email Class) คุณจะต้องใช้:

$this->load->library('email');

เมื่อโหลดเสร็จแล้วคุณจะใช้ตัวแปรคลาสตามปกติสำหรับคลาสที่ต่อเติมมา ในกรณีคลาสอีเมล์นี้ (Email Class) จะเรียกแบบนี้ทั้งหมด

$this->email->some_function();

ตั้งค่าคำนำหน้าของคุณ

สำหรับการตั้งค่าคำนำหน้าของคลาสรองของคุณ ให้เปิดไฟล์ application/config/config.php และมองหาสิ่งนี้

$config['subclass_prefix'] = 'MY_';

สังเกตุว่าไลบรารี่พื้นฐานของ CodeIgniter มีคำนำหน้าว่า CI_ ดังนั้นอย่าใช้มันเป็นคำนำหน้าของคุณ