Source for file Ethna_ClassFactory.php
Documentation is available at Ethna_ClassFactory.php
// vim: foldmethod=marker
* @author Masaki Fujimoto <fujimoto@php.net>
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
// {{{ Ethna_ClassFactory
* Ethnaフレームワークのオブジェクト生成ゲートウェイ
* DIコンテナか、ということも考えましたがEthnaではこの程度の単純なものに
* 留めておきます。アプリケーションレベルDIしたい場合はフィルタチェインを
* @author Masaki Fujimoto <fujimoto@php.net>
/** @var object Ethna_Controller controllerオブジェクト */
/** @var object Ethna_Controller controllerオブジェクト(省略形) */
/** @var array 生成済みオブジェクトキャッシュ */
/** @var array 生成済みアプリケーションマネージャオブジェクトキャッシュ */
/** @var array メソッド一覧キャッシュ */
var $method_list =
array();
* Ethna_ClassFactoryクラスのコンストラクタ
* @param object Ethna_Controller &$controller controllerオブジェクト
* @param array $class クラス定義
$this->controller =
& $controller;
$this->ctl =
& $controller;
* typeに対応するアプリケーションマネージャオブジェクトを返す
* (PHP自体が、クラス名の大文字小文字を区別しないため)
* @param string $type アプリケーションマネージャー名
* @param bool $weak オブジェクトが未生成の場合の強制生成フラグ(default: false)
* @return object Ethna_AppManager マネージャオブジェクト
// すでにincludeされていなければ、includeを試みる
// ここで返されるクラス名は、AppObjectの命名規約によるもの
// これは、AppObject のファイル中にAppManagerが含まれる場合が
// すでにincludeされていなければ、includeを試みる
// ここで返されるクラス名は、AppManagerの命名規約によるもの
&&
$this->_include($class_name) ===
false) {
return $obj; // include 失敗。戻り値はNULL。
if (isset
($this->method_list[$class_name]) ==
false) {
for ($i =
0; $i <
count($this->method_list[$class_name]); $i++
) {
$this->method_list[$class_name][$i] =
strtolower($this->method_list[$class_name][$i]);
// PHPのクラス名は大文字小文字を区別しないので、
// 同じクラス名と見做されるものを指定した場合には
// 以下のルールに従って、キャッシュが利用可能かを判定する
// 利用可能と判断した場合、キャッシュされていればそれを返す
// 1. メソッドに getInstance があればキャッシュを利用可能と判断する
// この場合、シングルトンかどうかは getInstance 次第
// 2. weak が true であれば、キャッシュは利用不能と判断してオブジェクトを再生成
// 3. weak が false であれば、キャッシュは利用可能と判断する(デフォルト)
if (isset
($this->manager[$type]) &&
is_object($this->manager[$type])) {
return $this->manager[$type];
// インスタンス化のヘルパ(getInstance)があればそれを使う
if (in_array("getinstance", $this->method_list[$class_name])) {
$obj =
& new $class_name($backend);
// 生成したオブジェクトはとりあえずキャッシュする
if (isset
($this->manager[$type]) ==
false ||
is_object($this->manager[$type]) ==
false) {
$this->manager[$type] =
& $obj;
* クラスキーに対応するオブジェクトを返す/クラスキーが未定義の場合はAppObjectを探す
* クラスキーとは、[Appid]_Controller#class に定められたもの。
* @param string $key [Appid]_Controller#class に定められたクラスキー
* @param bool $ext オブジェクトが未生成の場合の強制生成フラグ(default: false)
* @return object 生成されたオブジェクト(エラーならnull)
if (isset
($this->class[$key]) ==
false) {
list
($key_type, $key_value, $prop) =
$ext;
$class_name =
$this->class[$key];
// すでにincludeされていなければ、includeを試みる
if ($this->_include($class_name) ==
false) {
return $object; // include 失敗。返り値はnull
// AppObject はキャッシュされないことに注意
if (isset
($this->class[$key]) ==
false) {
$object =
& new $class_name($backend, $key_type, $key_value, $prop);
// Ethna_Controllerで定義されたクラスキーの場合
if (isset
($this->method_list[$class_name]) ==
false) {
for ($i =
0; $i <
count($this->method_list[$class_name]); $i++
) {
$this->method_list[$class_name][$i] =
strtolower($this->method_list[$class_name][$i]);
// 以下のルールに従って、キャッシュが利用可能かを判定する
// 利用可能と判断した場合、キャッシュされていればそれを返す
// 1. メソッドに getInstance があればキャッシュを利用可能と判断する
// この場合、シングルトンかどうかは getInstance 次第
// 2. weak が true であれば、キャッシュは利用不能と判断してオブジェクトを再生成
// 3. weak が false であれば、キャッシュは利用可能と判断する(デフォルト)
if (isset
($this->object[$key]) &&
is_object($this->object[$key])) {
return $this->object[$key];
$object =
& $this->$method($class_name);
} else if (in_array("getinstance", $this->method_list[$class_name])) {
$object =
& new $class_name();
// クラスキーに定められたクラスのインスタンスは
if (isset
($this->object[$key]) ==
false ||
is_object($this->object[$key]) ==
false) {
$this->object[$key] =
& $object;
* @param string $key クラスキー
if (isset
($this->class[$key]) ==
false) {
return $this->class[$key];
* @param string $class_name クラス名
* @return object 生成されたオブジェクト(エラーならnull)
$_ret_object =
& new $class_name($this->ctl);
* @param string $class_name クラス名
* @return object 生成されたオブジェクト(エラーならnull)
$_ret_object =
& new $class_name($this->ctl);
* @param string $class_name クラス名
* @return object 生成されたオブジェクト(エラーならnull)
* @param string $class_name クラス名
* @return object 生成されたオブジェクト(エラーならnull)
$_ret_object =
& new $class_name($this->ctl);
* @param string $class_name クラス名
* @return object 生成されたオブジェクト(エラーならnull)
$_ret_object =
& new $class_name($this->ctl);
* @param string $class_name クラス名
* @return object 生成されたオブジェクト(エラーならnull)
$_ret_object =
& new $class_name($this->ctl);
* @param string $class_name クラス名
* @return object 生成されたオブジェクト(エラーならnull)
* @param string $class_name クラス名
* @return object 生成されたオブジェクト(エラーならnull)
$_ret_object =
& new $class_name($this->ctl);
* 指定されたクラスから想定されるファイルをincludeする
$file =
sprintf("%s.%s", $class_name, $this->controller->getExt('php'));
if (preg_match('/^(\w+?)_(.*)/', $class_name, $match)) {
// App_Foo_Bar_Baz -> Foo/Bar/App_Foo_Bar_Baz.php
$tmp[count($tmp)-
1] =
$class_name;
$this->controller->getExt('php'));
// try ethna app & pear mixed style
// App_Foo_Bar_Baz -> Foo/Bar/Baz.php
$this->controller->getExt('php'));
// try ethna master style
// Ethna_Foo_Bar -> class/Ethna/Foo/Ethna_Foo_Bar.php
$this->controller->getExt('php'));
// Foo_Bar_Baz -> Foo/Bar/Baz.php
$this->controller->getExt('php'));
* 指定されたクラスがキャッシュを利用可能かどうかをチェックする
// if we have getInstance(), use this anyway
if (in_array('getinstance', $method_list)) {
// if not, see if weak or not
return $weak ?
false :
true;
Documentation generated on Fri, 11 Nov 2011 03:59:24 +0900 by phpDocumentor 1.4.3