许多框架决定使用这种方法:强制用户扩展基本控制器类(如果要创建新控制器)或扩展基础模型类(如果要创建新模型).
我们来看看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类.
缺点
>您必须强制用户扩展基类
>您必须强制用户在类构造中调用parent :: __ construct()
> get_instace()是保留的
> $this->实例重新定义会导致致命错误
>您基本上在Model基类和Controller基类中重复了相同的代码
现在让我们来看看另一种方法:
创建一个静态类,例如App,它执行基本控制器执行的所有操作:
例如,$this-> load-> …将是App :: load-> ….
现在再次考虑利弊:
PRO
>您可以通过App :: ….访问有用的CI类
>您不必强制用户扩展基类
>您不必强制用户在类构造中调用parent :: __ construct()
>没有方法保留名称或属性名称
>您可以在模型和控制器中使用App
缺点
>你没有更多$this->性感语法???
题
这里提出了一个真正的问题:与CI相比,第二种方法是更好还是更差?为什么?