ライブラリの作成
"ライブラリ" と言えば、ふつうは、 libraries ディレクトリにあるクラスで、このユーザガイドのクラスリファレンスで説明されているクラスのことを指します。 しかし、ここでは、その代りに、ユーザライブラリの作成方法を説明します。 ユーザライブラリは、グローバルなフレームワークのリソースからローカルなリソースを区別しておくため application/libraries ディレクトリに作成します。
追加の特典として、CodeIgniter では、既存のライブラリに単に、機能を追加するのであれば、ネイティブなクラスを 継承(extend) してユーザライブラリを作成できます。 application/libraries フォルダに同じ名前で設置しさえすれば、ネイティブなクラスを独自のものと置き換えることもできます。
まとめると:
- まったく新しいライブラリを作成することができます。
- ネイティブなライブラリを拡張(継承)できます。
- ネイティブなライブラリを置き換えることができます。
このページの以下では、これらの3つのコンセプトの詳細について説明します。
Note: データベースクラスは拡張(継承)またはユーザクラスに置き換えができません。他のクラスは全部置き換え/拡張(継承)が可能です。
保存場所
ユーザライブラリは、application/libraries フォルダに設置する必要があります。これは、CodeIgniter が 初期化するのに探しに行く場所になります。
名づけルール
- ファイル名は先頭が大文字である必要があります。例: Myclass.php
- クラスの宣言は先頭が大文字である必要があります。例: class Myclass
- クラス名とファイル名は一致する必要があります。
クラスファイル
クラスはこのような基本的なひな形になります。 (Note:単にサンプル用に、 Someclass という名前を使っています):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
public function some_function()
{
}
}
/* End of file Someclass.php */
クラスの使用
コントローラ のメソッド内のいずれの場所からも、次のような標準的なやり方で、クラスを初期化することができます:
$this->load->library('someclass');
ここでの someclass は、".php" ファイルの拡張子を除いたファイル名になります。ファイル名は最初が大文字でも小文字でも指定できます。 CodeIgniter ではどちらでも動きます。
いったんロードされると、小文字で表したクラス名でクラスにアクセスできます:
$this->someclass->some_function(); // オブジェクトインスタンスは、常に小文字になります
クラス初期化時のパラメータの引き渡し
ライブラリの読み込みメソッドで、第2引数を経由して動的に配列でデータを渡すことができます。 データはクラスのコンストラクタに渡されます:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);
この機能を使うとき、クラスのコンストラクタでデータを受け取れるようにしておかなければなりません:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
public function __construct($params)
{
// $params を使って何かを行う
}
}
?>
設定ファイルに保存したパラメータを渡すこともできます。単純に、クラスのファイル名と同じ名前の設定ファイルを作成し、 application/config/ に入れておきます。上のように動的にパラメータが渡される場合は、 設定ファイルのオプションは利用できなくなることを注意してください。
ライブラリの内部で CodeIgniter のリソースを利用する
ライブラリの内部で CodeIgniter のネイティブなリソースにアクセスするには、get_instance() 関数を使います。 この関数は CodeIgniter のルートオブジェクトを返します。
通常は、コントローラのメソッド内でアクセスするには、CodeIgniter のどんな機能を使うにも $this の初期化メソッドを使います:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.
しかし、$this は、コントローラ、モデル、ビューの中で直接使うときだけ動作します。 CodeIgniter のクラスを自作クラスの中で呼び出して使いたい場合は、次のようにすることで使えます:
まず、CodeIgniter オブジェクトを変数に代入します:
$CI =& get_instance();
変数にオブジェクトを代入したら、$this のかわりにその変数を使います:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
など
Note: 上で、get_instance() 関数が参照渡しされているのを注意してください:
$CI =& get_instance();
これは非常に重要です。参照渡しすることで、コピーではなく、オリジナルの CodeIgniter オブジェクトを利用できます。
ネイティブライブラリをユーザバージョンのライブラリで置換する
単に、ネイティブライブラリと同じファイル名をユーザクラスの名前にすれば、CodeIgniter は、ネイティブクラスを使う代わりにユーザクラスを使うようになります。この機能を使うには、 ファイル名とクラス宣言をネイティブライブラリと正確に同じにする必要があります。たとえば、ネイティブの Email ライブラリを置き換えるには、 application/libraries/Email.php という名前のファイルを作成し、その中で、下記のようにクラスを宣言します:
class CI_Email {
}
ネイティブクラスのほとんどには、CI_ というプリフィックス(接頭辞)が付いているのを注意してください。
ユーザライブラリをロードするには、下記のように、通常のロードメソッドを使います:
$this->load->library('email');
Note: 現時点ではデータベースクラスはユーザバージョンに置換できません。
ネイティブライブラリの拡張(継承)
既存の関数に何かの機能を追加する - おそらく一つか二つのメソッド追加 - だけでよいのであれば、 ライブラリの全部をユーザバージョンに置き換えてしまうのはやり過ぎです。このようなケースでは、クラスを単に拡張(継承)するのが適しています。 クラスの拡張はクラスの置き換えと次の2点を除いてよく似ています:
- クラス宣言では親クラスを継承する必要があります。
- 新しいクラスの名前とファイル名には、MY_ というプリフィックス(この項目は変更できます。このページの下の方をご覧ください)を付ける必要があります。
たとえば、ネイティブのEmailクラスを拡張するには、application/libraries/MY_Email.php という名前のファイルを作成し、次のようにクラス宣言をします:
class MY_Email extends CI_Email {
}
Note: ユーザクラスでコンストラクタを使う場合は親クラスのコンストラクタを呼ぶのを忘れないでください:
class MY_Email extends CI_Email {
public function __construct()
{
parent::__construct();
}
}
ユーザ作成のサブクラスをロードする
ユーザ作成のサブクラスをロードするには、通常使う構文を使うことができます。プリフィックスを含めてはいけません。たとえば、 上の例で Email クラスを拡張したクラスをロードするには、次のようなコードを使います:
$this->load->library('email');
ロードしたら、通常のクラスをロードしたときに使うオブジェクト操作用の変数をユーザクラス用に使うことができます。 この email クラスの例では、次のようなコードを使ってクラスのメソッドを呼び出します:
$this->email->some_function();
独自のプリフィックスを設定する
ユーザ作成のサブクラスにつけるプリフィックスを設定するには、application/config/config.php ファイルを開き、次の項目を探して設定してください:
$config['subclass_prefix'] = 'MY_';
CodeIgniter の全ネイティブライブラリには CI_ というプリフィックスがついているのを注意してください。ユーザ作成クラスのプリフィックスには、この CI_ を使用してはいけません。