Ethna_ClassFactory::getObject
■呼び元
Ethna_Controller::getUrlHandler
/**
* クラスキーに対応するオブジェクトを返す/クラスキーが未定義の場合はAppObjectを探す
*
* @access public
* @param string $key クラスキー
* @param bool $weak オブジェクトが未生成の場合の強制生成フラグ(default: false)
* @return object 生成されたオブジェクト(エラーならnull)
*/
function &getObject($key, $ext = false)
{
$object = null;
$ext = to_array($ext); // 配列に変換
if (isset($this->class[$key]) == false) { // クラスが定義されていない場合
// app object (例:Sample_ClassName)
$class_name = $this->controller->getObjectClassName($key);
$ext = array_pad($ext, 3, null);
list($key_type, $key_value, $prop) = $ext;
} else {
// ethna classes
$class_name = $this->class[$key];
$ext = array_pad($ext, 1, null);
list($weak) = $ext;
}
// try to include if not defined
if (class_exists($class_name) == false) {
if ($this->_include($class_name) == false) {
return $object;
}
}
// handle app object first
if (isset($this->class[$key]) == false) {
$backend =& $this->controller->getBackend();
$object =& new $class_name($backend, $key_type, $key_value, $prop);
return $object;
}
if (isset($this->method_list[$class_name]) == false) {
$this->method_list[$class_name] = get_class_methods($class_name);
for ($i = 0; $i < count($this->method_list[$class_name]); $i++) {
$this->method_list[$class_name][$i] = strtolower($this->method_list[$class_name][$i]);
}
}
// see if this should be singlton or not
if ($this->_isCacheAvailable($class_name, $this->method_list[$class_name], $weak)) {
if (isset($this->object[$key]) && is_object($this->object[$key])) {
return $this->object[$key];
}
}
// see if we have helper methods
$method = sprintf(’_getObject_%s’, ucfirst($key));
if (method_exists($this, $method)) {
$object =& $this->$method($class_name);
} else if (in_array(”getinstance”, $this->method_list[$class_name])) {
$object =& call_user_func(array($class_name, ‘getInstance’));
} else {
$object =& new $class_name();
}
if (isset($this->object[$key]) == false || is_object($this->object[$key]) == false) {
$this->object[$key] =& $object;
}
return $object;
}
トラックバック URL :