许多框架决定使用这种方法:强制用户扩展基础控制器类(如果要创建新控制器)或扩展基础模型类(如果要创建新模型) )。
让我们看一下CodeIgniter控制器基类的代码:
/**
* Constructor
*/
public function __construct()
{
self::$instance =& $this;
// Assign all the class objects that were instantiated by the
// bootstrap file (CodeIgniter.php) to local class variables
// so that CI can run as one big super object.
foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core');
$this->load->initialize();
log_message('debug', "Controller Class Initialized");
}
它做什么?好吧,据我所知,它只允许我们使用$this->load->...
为例。
让我们看一下模型基类的__get()
魔术方法:
/**
* __get
*
* Allows models to access CI's loaded classes using the same
* syntax as controllers.
*
* @param string
* @access private
*/
function __get($key)
{
$CI =& get_instance();
return $CI->$key;
}
它完全一样。现在这种做事方式带来了什么?
PRO
$this->...
访问有用的CI类。CONS
parent::__construct()
get_instace()
已保留$this->instance
重新定义会导致致命错误现在让我们来看看另一种方法:
创建一个静态类,例如App
,它执行基本控制器执行的所有操作:
例如,$this->load->...
将为App::load->...
。
现在再次考虑利弊:
PRO
App::...
访问有用的CI类。parent::__construct()
CONS
$this->
性感语法??? 问题
这是真正的问题:与CI相比,第二种方法是更好还是更差?为什么呢?
答案 0 :(得分:2)
PRO
- 您可以通过App :: ....
访问有用的CI类- 您不必强制用户扩展基类
- 您不必强制用户在类构造中调用parent :: __ construct()没有方法
- 名称或属性名称已保留
这不完全有效。 CI从不强制dev扩展基类。可以轻松扩展所有核心框架功能。您可以在MY_Controller.php
文件夹中包含application/core
,包含您自己的基类,例如:
Front_Controller extends CI_Controller{
// Share common properties or functionalities across front/public controllers here
}
Admin_Controller extends CI_Controller{
// Share common properties or functionalities across administrative controllers here
}
然后,parent::parent_method()
在PHP中很常见。如果您真的在应用程序中使用OO设计,那么大多数情况下您会在其他地方使用此语法。这使您可以在不丢失父类的继承功能的情况下向子类添加功能。
回答你的问题:
这就是真正的问题:第二个是更好还是更糟 方法与CI相比?为什么呢?
这两种尝试都可以被认为是合法的,atm。因为,1)在CI引导程序中没有一致性检查(例如PHP 5中的instanceof CI_Controller
或PHP4的is_a
),并且CI不会强制您返回任何内容一个控制器动作方法(一个Response
对象,例如在SF中)。
多数说,你可以让一个任意的阶级充当控制者。事实上,您并不需要将核心控制器功能包装在静态类中,没有人会限制您在这些任意类中使用get_instance()->load->library('foo')
和get_instance()->load->database()
。