gpt4 book ai didi

php - CodeIgniter 基类,这是为什么呢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:45:28 25 4
gpt4 key购买 nike

许多框架决定使用这种方法:强制用户扩展一个 Controller 基类(如果你想创建一个新 Controller )或扩展一个模型基类(如果你想创建一个新模型) ).

我们来看一下CodeIgniter的 Controller 基类的代码:

/**
* 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;
}

它做的事情完全一样。现在这种做事方式带来了什么?

专业版

  • 您可以通过 $this->... 访问有用的 CI 类。

缺点

  • 你必须强制用户扩展基类
  • 您必须强制用户在类构造中调用parent::__construct()
  • get_instace() 保留
  • $this->instance 重定义导致 fatal error
  • 您基本上在 Model 基类和 Controller 基类中重复了相同的代码

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

创建一个静态类,例如 App 来完成基本 Controller 所做的所有事情:例如,$this->load->... 将是 App::load->...

现在再考虑一下利弊:

专业版

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

缺点

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

问题

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

最佳答案

PRO

  • You can access useful CI classes by App::....
  • You don't have to force the user to extends the base class
  • You don't have to force the user to call the parent::__construct() in the class construct no methods
  • name or properties name are reserved

这不完全有效。 CI 从不强制开发人员扩展基类。所有核心框架功能都可以轻松扩展。您可以在 application/core 文件夹中包含 MY_Controller.php,包含您自己的基类,例如:

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 设计,其他地方也会有这种语法。这使您能够向子类添加功能,而不会丢失从父类继承的功能。

所以回答你的问题:

Here it comes the real question: would be the second a better or worse approach compared to the CI one? Why?

这两种尝试都可以认为是合法的,atm。因为,事实是:1) CI Bootstrap 中没有一致性检查(类似于 PHP 5 中的 instanceof CI_Controller,或 PHP4 中的 is_a),2) 并且,CI不会强制您从 Controller 操作方法(例如 SF 中的 Response 对象)返回任何内容。

也就是说,您可以让任意类充当 Controller 。事实上,您不需要将核心 Controller 功能包装在静态类中,没有人阻止您使用 get_instance()->load->library('foo')get_instance( )->load->database() 在那些任意类中。

关于php - CodeIgniter 基类,这是为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9976646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com