나만의 라이브러리 만들기Creating Libraries
우리가 라이브러리(Libraries)라고 말할때는 일반적으로 libraries 폴더안에 위치하며 본 사용자 가이드에 설명되어있는 그것을 뜻합니다.하지만 여기서는 그 라이브러리가 아니라 님하가 어떻게 application/libraries 저장될 님하만의 라이브러리를 만들지를 설명합니다. 또한 그 라이브러리를 글로벌 라이버러리와 어떻게 분리하여 관리하는지도 설명합니다.
보너스로 CodeIgniter 는 기존의 라이브러리를 확장하여 ( extend) 님하만의 라이브러리를 만들수 있도록 지원합니다.아니면 이미 내장된 라이브러리를 application/libraries 에 저장된 동일한 버전 및 이름의 님하가 만든라이브러리도 대체할수도 있습니다.
요약하자면:
- 남하는 완전히 새로운 라이브러리를 만들 수 있습니다..
- 내장된 라이브러리를 확장하여 여러분만의 라이브러리를 만들수 있습니다..
- 내장된 라이브러리를 대체할수도 있습니다..
아래에 설명된 내용들은 이러한 3가지를 어떻게 할수 있는지 상세하게 설명합니다..
Note: 데이터베이스 클래스는 확장되거나 대체될 수 없습니다.PHP4 의 로더(Loader class) 클래스또한 확장,대체될 수 없습니다.그외 모든 클래스는 확장,대체될 수 있습니다.
저장
님하의 라이브러리는 반드시 application/libraries 에 위치해야합니다.CodeIgniter 가 초기화 과정에서 그 디렉토리를 살펴보기 때문입니다.
이름짓기 관례(Naming Conventions)
- 파일이름은 반드시 대문자로 시작해야합니다. 예제: Myclass.php
- 클래스 선언부는 반드시 대문자로 시작해야합니다. 예: class Myclass
- 클래스명과 파일명은 반드시 동일해야합니다.
클래스 파일
클래스는 반드시 아래의 프로토타입 형태를 따라야합니다.(Note: Someclass 이라는 이름은 예를 든것입니다.):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
function some_function()
{
}
}
?>
여러분의 클래스를 사용하기
어떤 여러분의 콘트롤러 함수에서도 여러분의 클래스를 아래와 같이 초기화 할수 있습니다.:
$this->load->library('someclass');
someclass 는 파일 이름이고 ".php" 확장자는 붙이지 않습니다..여기에서 파일이름을 대문자로 쓰든 소문자로 쓰든CodeIgniter 는 상관하지않고인식합니다..
일단 로드되면 여러분의 클래스를 lower case 소문자 버전으로 사용해야합니다:
$this->someclass->some_function(); // 객체는 항상 소문자로 사용되야합니다
여러분의 클래스 초기화 과정에 파라미터 넘겨주기
라이브러리 로드 함수에서 님하는 두번째 파라미터를 통하여 동적으로 배열 형태의 데이터를 넘겨줄수 있습니다. 파라미터는 님하만의 클래스 생성자에 데이터를 넘겨줄것입니다.:
$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 을 이용하는 방법은 비활성(will not be available)화 될것입니다.
CodeIgniter 리소스를 여러분의 라이브러리와 함께 사용하기
직접 만든 라이브러리에서 CodeIgniter에 내장된 리소스를 이용하려면 get_instance() 함수를 이용합니다. 그함수는 CodeIgniter 의 부모객체(super object)를 리턴합니다.
일반적으로 당신이 만든 컨트롤러함수에서 $this 를 사용하여 CodeIgniter의 가능한 모든 함수들을 호출할것입니다.:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.
그러나 $this는 컨트롤러,뷰,모델에서만 직접적으로 사용할 수 있습니다.
만약 당신이 만든 라이브러리(custom class) 에서 CodeIgniter의 클래스를 사용하고자한다면 아래와 같은 방법으로 해야합니다.:
먼저 CodeIgniter객체를 변수로 할당합니다.:
$CI =& get_instance();
한번 할당한 후에는 $this 를 썼던 것대신에 새로할당한 변수($CI)를 대신 사용하면 됩니다:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.
Note: 위에 사용된 get_instance() 는 객체를 참조로 넘겨줍니다.(& 를 주목할것):
$CI =& get_instance();
이것은 매우 중요합니다. 참조로 넘겨준다는것은 복사본이 아니라 원본의CodeIgniter 객체를 사용한다는것을 의미합니다.
또한 주의하세요: PHP 4 를 사용하신다면 생성자에서 get_instance()
함수를 호출하지마세요 . PHP 4 에서는 CodeIgniter 의 부모객체(super object)를 생성자에서 사용할때 문제가 발생합니다. 왜냐하면 클래스가 완전한 인스턴스가 되기전에는 CodeIgniter 객체가 존재할수 없기 때문입니다.(즉 PHP4 에서는 클래스의 생성자함수 실행이 완료된후에서야 객체가 존재하고 객체가 있어야 다른 객체를 생성할수 있기때문)
내장된 라이브러리를 나만의 라이브러리로 대체하기 Replacing Native Libraries with Your Versions
간단히 당신의 라이브러리 이름을 내장된 라이브러리와 완전히 동일하게 하면 CodeIgniter 는 내장 라이브러리대신 당신의 라이브러리를 사용합니다. 이렇게 하려면 파일이름과 클래스 선언부를 내장라이브러리와 동일하게 하면 됩니다. 예를 들어, 내장 Email 라이브러리를 대체하려면 application/libraries/Email.php 파일을 만들고 클래스를 아래와 같이 선언합니다.
class CI_Email {
}
주의 : 대부분의 내장라이브러리는 접두어CI_를 사용합니다.
당신의 라이브러리를 로드 하라면 표준 로딩 함수를 사용하면 됩니다.:
$this->load->library('email');
Note: Database 클래스는 당신의 라이브러리로 대체될 수 없습니다..
내장 라이브러리의 확장 Extending Native Libraries
내장 라이브러리에 몇몇 기능요소들을 추가하려한다면(아마 한두개의 함수추가) 라이브러리 자체를 바꾸는것은 심한 오버헤드가 될것입니다. 이럴때는 간단히 내장라이브러리를 확장하는것이 현명합니다. 라이브러리확장은 몇가지를 제외하고는 라이브러리대체와 거의 비슷합니다.
- 클래스는 부모클래스(parent class)를 확장해야 한다..
- 당신의 클래스이름 및 파일이름은 MY_ 로 시작해야한다.(이 접두어는 설정에서 변경할수 있습니다).
예를 들어 ,내장 Email 클래스를 확장하고자 한다면 application/libraries/MY_Email.php 파일을 생성하고 클래스를 아래와 같이 선언합니다:
class MY_Email extends CI_Email {
}
Note: 만약 당신의 클래스에서 생성자를 사용하고자 한다면 부모클래스의 생성자를 그 내부에서 호출해야한다는걸 잊지마세요 :
class MY_Email extends CI_Email {
function My_Email()
{
parent::CI_Email();
}
}
당신의 확장 클래스를 로드하는법 (Loading Your Sub-class)
새롭게 만든 확장 클래스는 일반적인 클래스 로드와 동일한 방법으로 로드합니다.이때 접두어는 적으시면 안됩니다..예를들어 ,위의 예에서 만든 Email 클래스의 확장 클래스를 로드할때 아래와같이 합니다.:
$this->load->library('email');
한번 로드한 후에는 다른 일반적인 방법(확장하기전의 원본클래스를 사용하듯)과 동일하게 사용하면됩니다. 위에서 만든 Email 클래스의 경우 아래와 같이 사용합니다.:
$this->email->some_function();
나만의 접두어 설정 (Setting Your Own Prefix)
나만의 접두어를 설정하려면 application/config/config.php 파일을 열어 아래 변수를찾으세요 :
$config['subclass_prefix'] = 'MY_';
주의 : 모든 CodeIgniter 내장 라이브러리는 접두어로 CI_ 를 사용하므로 위 설정에서는 CI_ 를 사용하지 마세요 .