CodeIgniter基类,为什么呢?

时间:2012-04-02 12:42:53

标签: php codeigniter

许多框架决定使用这种方法:强制用户扩展基础控制器类(如果要创建新控制器)或扩展基础模型类(如果要创建新模型) )。

让我们看一下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重新定义会导致致命错误
  • 您基本上在Model基类和Controller基类
  • 中重复了相同的代码

现在让我们来看看另一种方法:

创建一个静态类,例如App,它执行基本控制器执行的所有操作: 例如,$this->load->...将为App::load->...

现在再次考虑利弊:

PRO

  • 您可以App::...访问有用的CI类。
  • 必须强制用户扩展基类
  • 必须强制用户调用类构造中的parent::__construct()
  • 没有方法名称或属性名称已保留
  • 您可以在模型和控制器中使用App

CONS

  • 你没有$this->性感语法???

问题

这是真正的问题:与CI相比,第二种方法是更好还是更差?为什么呢?

1 个答案:

答案 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()