CodeIgniter ユーザガイド 日本語版 Version 1.7.3


ライブラリの作成

"ライブラリ" と言えば、ふつうは、 libraries ディレクトリにあるクラスで、このユーザガイドのクラスリファレンスで説明されているクラスのことを指します。 しかし、ここでは、その代りに、ユーザライブラリの作成方法を説明します。 ユーザライブラリは、グローバルなフレームワークのリソースからローカルなリソースを区別しておくため application/libraries ディレクトリに作成します。

追加の特典として、CodeIgniterでは、既存のライブラリに単に、機能を追加するのであれば、ネイティブなクラスを 継承(extend) してユーザライブラリを作成できます。 application/libraries フォルダに同じ名前で設置しさえすれば、ネイティブなクラスを独自のものと置き換えることもできます。

まとめると:

このページの以下では、これらの3つのコンセプトの詳細について説明します。

Note: データベースクラスは拡張(継承)またはユーザクラスに置き換えができません。 PHP 4でのローダークラスも同様です。他のクラスは全部置き換え/拡張(継承)が可能です。

保存場所

ユーザライブラリは、application/libraries フォルダに設置する必要があります。これは、CodeIgniter が 初期化するのに探しに行く場所になります。

名づけルール

クラスファイル

クラスはこのような基本的なひな形になります。 (Note:単にサンプル用に、 Someclass という名前を使っています):

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

class Someclass {

    function some_function()
    {
    }
}

?>

クラスの使用

コントローラ のメソッド内のいずれの場所からも、次のような標準的なやり方で、クラスを初期化することができます:

$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 {

    function Someclass($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オブジェクトを利用できます。

また次のことに注意してください: もしPHP4を実行している場合、通常は get_instance() をクラスのコンストラクタの中で呼び出さないようにするのが適切です。PHP 4 では、クラスが完全にインスタンス化された後でないとオブジェクトが存在できないため、 アプリケーションのコンストラクタの中でCI基底オブジェクトをうまく参照できない問題があります。

ネイティブライブラリをユーザバージョンのライブラリで置換する

単に、ネイティブライブラリと同じファイル名をユーザクラスの名前にすれば、CodeIgniterは、ネイティブクラスを使う代わりにユーザクラスを使うようになります。この機能を使うには、 ファイル名とクラス宣言をネイティブライブラリと正確に同じにする必要があります。たとえば、ネイティブの Email ライブラリを置き換えるには、 application/libraries/Email.php という名前のファイルを作成し、その中で、下記のようにクラスを宣言します:

class CI_Email {

}

ネイティブクラスのほとんどには、CI_ というプリフィックス(接頭辞)が付いているのを注意してください。

ユーザライブラリをロードするには、下記のように、通常のロードメソッドを使います:

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

Note: 現時点ではデータベースクラスはユーザバージョンに置換できません。

ネイティブライブラリの拡張(継承)

既存の関数に何かの機能を追加する - おそらく一つか二つのメソッド追加 - だけでよいのであれば、 ライブラリの全部をユーザバージョンに置き換えてしまうのはやり過ぎです。このようなケースでは、クラスを単に拡張(継承)するのが適しています。 クラスの拡張はクラスの置き換えと次の2点を除いてよく似ています:

たとえば、ネイティブの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();
    }
}

ユーザ作成のサブクラスをロードする

ユーザ作成のサブクラスをロードするには、通常使う構文を使うことができます。プリフィックスを含めてはいけません。たとえば、 上の例でEmailクラスを拡張したクラスをロードするには、次のようなコードを使います:

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

ロードしたら、通常のクラスをロードしたときに使うオブジェクト操作用の変数をユーザクラス用に使うことができます。 このemailクラスの例では、次のようなコードを使ってクラスのメソッドを呼び出します:

$this->email->some_function();

独自のプリフィックスを設定する

ユーザ作成のサブクラスにつけるプリフィックスを設定するには、application/config/config.php ファイルを開き、次の項目を探して設定してください:

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

CodeIgniter の全ネイティブライブラリには CI_ というプリフィックスがついているのを注意してください。ユーザ作成クラスのプリフィックスには、この CI_ を使用してはいけません。