クラス

定義の仕方と命名規則

オブジェクト名やメソッド名では、頭文字とアンダーバー直後の文字が大文字に変換されて認識されます。したがって以下はそれぞれ同じオブジェクトとしてアクセスできます。

AbcDef<=>abc_def
Abcd<=>abcd

クラス名とクラスファイル名は左の(大文字で始まる)名前、URLでは右の名前、インスタンス生成メソッドの引数として指定する場合はいずれか決めたほうで統一します。

クラスの種類

フレームワークのクラス名とクラスファイル名、プログラムから呼び出す(インスタンスを生成する)際の具体的な方法です。

Chimpanzeeではメモリ節約のため各機能は細かくクラスに分類されており、機能を使用する際はその都度クラスのインスタンスを生成します。逆にいうとインスタンスを生成しない限りクラスを読み込まないので、その分のメモリを消費しないことになります。利用するクラスには以下の種類があります。

コントローラ
クライアントからのリクエストを受け付けて処理を行います。
モデル
データ処理を制御します。
フォーム
フォームに関するクライアントからの入力を制御します。
定数テーブル
定数テーブルを定義し、呼び出します。
ユーザ定義関数
ユーザ定義関数を定義し、呼び出します。
モジュール
ユーザ認証など、フレームワークが提供するその他の機能を制御します。
設定
フレームワークの挙動を設定します。

これらのクラス名それぞれにプレフィクスが設定され、それによって同じ定数テーブルやモデル名でも異なるクラスとして認識されています。クラス名が「AbcDef」のときのクラスファイルの配置パスや定義する際のプレフィクス付きクラス名などはクラスの種類ごとに以下のようになります。

クラスの種類 配置パス (クラスを定義するときの)
プレフィクス付きクラス名
インスタンスの生成(new) ロード(load)
コントローラ (app_root)/ctrls/AbcDef.php ctrlAbcDef - -
モデル (app_root)/models/AbcDef.php modelAbcDef $this->newModel('AbcDef')
or
$this->newModel('abc_def')
$this->loadModel('AbcDef')
or
$this->loadModel('abc_def')
フォーム (app_root)/forms/AbcDef.php formAbcDef $this->newForm('AbcDef')
or
$this->newForm('abc_def')
$this->loadForm('AbcDef')
or
$this->loadForm('abc_def')
定数テーブル (app_root)/tables/AbcDef.php tableAbcDef $this->newTable('AbcDef')
or
$this->newTable('abc_def')
$this->loadTable('AbcDef')
or
$this->loadTable('abc_def')
ユーザ定義関数 (app_root)/funcs/AbcDef.php funcAbcDef $this->newFunc('AbcDef')
or
$this->newFunc('abc_def')
$this->loadFunc('AbcDef')
or
$this->loadFunc('abc_def')
モジュール (CZ_root)/public/modules/AbcDef.php CZMAbcDef $this->newModule('AbcDef')
or
$this->newModule('abc_def')
$this->loadModule('AbcDef')
or
$this->loadModule('abc_def')
設定 (app_root)/configs/AbcDef.php configAbcDef - -

クラスの定義

上記の命名規則に基づいて1クラス1ファイルでクラスファイルを作成することになります。たとえばコントローラのクラスファイル(app_root)/ctrls/AbcDef.phpは以下のようになります。

<?
class ctrlAbcDef extends CZCtrl {
	public function ...
		:
}
?>

クラスの呼び出し

上記の機能はコントローラ(アクション)モデルフォームユーザ定義関数から利用することができます。利用する際には上記の各クラスをロードします。

Chimpanzeeはメモリ節約のため、クラスのロードとアンロードやクラス(インスタンス)の消費するメモリを制御できるようにしています。そこでクラスをロードする際に以下の2通りの方法を用意しています。

new

クラスをロードするたびに新しくインスタンスを生成する方法です。newXxx(string $name)(「Xxx」は呼び出し先のクラスの種類によって異なります)という形式のメソッドが用意されており、これを実行するとクラスを新しくロードし、インスタンスを取得できます。

$this->newXxx('Yyy');

PHPのクラスの使い方でいうと

new xxxYyy();

を実行するのと同じイメージです。

$obj = $this->newXxx('Yyy');

とすることで

$obj = new xxxYyy();

と同じようにインスタンスを取得することは可能なので、開発者がインスタンスを保持しておいてそのインスタンスからメソッドを実行することもできます。

$model = $this->newModel('Xxx');
$model->beginUpdate($id);							// (1)
	:
$model->commitUpdate($values);						// (2)

その場限りでクラス(メソッド)を使用する場合はインスタンスを保持せずに

$this->newModel('Xxx')->updateById($id, $record);

とすることで、これを実行した瞬間だけ(呼び出したクラスが)メモリを使用し、実行後は破棄するということになります。

一般的に整合性のある一連の処理を行う場合、インスタンスを保持する必要があることが多いのですが、Chimpanzeeの基底クラスはインスタンスを保持しなくても正常に動作するようになっています。したがってわざわざインスタンスを保持しておく必要はないでしょう。逆にインスタンスを保持しなければその分メモリ節約になります。以下の例はbeginUpdate()commitUpdate()という一連の処理ですが、

$this->newModel('Xxx')->beginUpdate($id);			// (3)
	:
$this->newModel('Xxx')->commitUpdate($values);		// (4)

とすることで、(3)を実行した瞬間と(4)を実行した瞬間だけしかメモリが消費されません。

load

クラスをロードする際、フレームワーク内部でインスタンスを保持する方法です。loadXxx(string $name)(「Xxx」は呼び出し先のクラスの種類によって異なります)という形式のメソッドが用意されており、これを実行するとChimpanzee内部でインスタンスを保持してクラスを使用することができます。newと同様、loadを実行したときにインスタンスを返しますのでメソッドチェインの形でメソッドを実行できます。

$this->loadModel('Xxx')->beginUpdate($id);

これにより、インスタンス($this->loadModel('Xxx')の戻り値でもありますが)が保持され、次回以降$this->loadModel('Xxx')からメソッドを実行するとき、先に生成したインスタンスから(つまりプロパティを保持したまま)メソッドが実行されます。通常以下のような形で使用します。

$this->loadModel('Xxx')->getRecordById($id);		// (5)
	:
$this->loadModel('Xxx')->updateById($id, $record);	// (6)

(5)と(6)は同じインスタンスから実行されます。つまりこれは

$model = newModel('Xxx');
$model->getRecordById($id);							// (7)
	:
$model->updateById($id, $record);					// (8)

と同じ処理をすることになります。インスタンスを保持することでクラスのプログラムやプロパティが使用するメモリは消費します。

たしかにloadでインスタンスを取得できるからといって

$model = $this->loadModel('Xxx');
$model->beginUpdate($id);
	:
$model->commitUpdate($values);

というコーディングも不可能ではありませんが、まったく意味はありません。

loadで保持したインスタンスはunloadによって破棄することが可能です。unloadXxx(string $name)(「Xxx」は呼び出し先のクラスの種類によって異なります)という形式のメソッドが用意されており、これを実行するとインスタンスを破棄してクラスの使用したメモリを解放します。unloadAll()で現在ロードされているすべてのインスタンスを破棄することができます。

newを使うか、loadを使うか

loadの実行後はインスタンスを保持するのでメモリを消費します。newは開発者がインスタンスを保持するコードを書かない限りクラスの使用するデータは保持されませんので、実行後はメモリを消費しません。ただしnewは実行する度にコンストラクタ処理が行われるため、処理に時間がかかる可能性があります。loadはそれがありません。
ちなみに従来のフレームワークは基本的にloadの思想で作られています。

newのみでプログラムは正常に動作するようになっています。基底クラスを使用する限りインスタンスを保持する必要はありません(ユーザ定義クラスでプロパティを使用する場合は必要なこともあります)。したがって基本的にはメモリを節約する方針で、newのみでインスタンスを保持せず実装しておいて結構です。ただし

場合、その処理についてloadを採用してください。

設定ファイルCZ.phpobj_load_onlyTRUE(デフォルトではFALSE)にすると、newXxx()を実行したときもloadXxx()と同じ動作をするようになります。したがってすべてnewで実装しておいて、レスポンスの速さが気になった場合にこの設定をTRUEにすれば従来のフレームワークと同レベルでの動作が保たれることになります。

予約済みメソッド

メソッド名の命名は自由ですが一部フレームワークで予約済みのメソッド名があり、これらは通常のメソッドとは異なる挙動をとります。したがって開発者がコーディングする際に通常のメソッドとしては使用できません。

すべてのクラスで使用できないもの

_construct()
クラスのコンストラクタとして使用されているので通常のメソッドとしては使用できません。

コントローラでのみ使用できないもの

_init()
他のコントローラから当該コントローラに移ってきた時に最初に実行されるメソッドです。
_common()
コントローラ内のメソッド(アクション)が実行される際、共通してその前に実行されるメソッドです。コンストラクタと異なり、メソッドが実行されるたびに処理が行われます。
xxx_init()
「_init」が最後に付くメソッドはすべて通常のメソッドとして使用できません。この予約済みメソッドの詳細はアクショングループを参照してください。
xxx_common()
「_common」が最後に付くメソッドはすべて通常のメソッドとして使用できません。この予約済みメソッドの詳細はアクショングループを参照してください。

コントローラでのみ、メソッド(アクション)名にプレフィクスが付きます。アクショングループに属さないメソッドでは「action」が、アクショングループ内のメソッドはアクショングループ名がプレフィクスとして付きます。プレフィクスの直後の文字は大文字となります。たとえばアクショングループがregistでメソッド名がconfirmのとき、コントローラ内で定義するメソッド名はregistConfirmとなります。コントローラのメソッドに関する詳細はアクションアクショングループを参照してください。

またビューの構造上、ビューのヘッダファイル名とフッタファイル名に重複する名前はコントローラのメソッド名として適用できません。デフォルトでは

がこれにあたりますが、設定ファイルView.phpheader_file_namefooter_file_nameで変更することができます。

前後のページ

ページトップへ