我正在研究代码点火器。我遇到了这个超级对象。
代码点火器有一个加载类并将它们存储在实例变量中的函数。每次我们需要包含一个新类或以前加载的类时,代码点火器首先在实例数组中搜索它,如果没有找到,则加载它并包含在instanc数组中。
我的问题是在类中我们可以通过load_class函数包含类(因为这个函数首先在insntance数组中搜索,所以减少一次又一次地包含相同类的开销),那么需要声明包含超级对象的内容预定义或加载新类。
当我们能够做到这一点时。
class CLASSNAME
{
function functionname()
{
$object = load_class(classname, location);
$object->callfunction();
}
}
那么为什么我们需要这样做
class CLASSNAME
{
function functionname()
{
$superobject = & get_instance();
$superobject->classobject->function();
}
}
只想知道使用超级对象的好处。它只是包含所有预定义的对象,或者更深层次和更有益的东西,我无法理解。
提前致谢。
答案 0 :(得分:0)
在您给出的示例中(如果您只需要对库的引用) - 没有任何好处。 get_instance()
只是一个更常见(并且已记录)的功能,而load_class()
仅供内部使用。
可能的好处是,get_instance()
使您可以访问控制器具有的所有,例如,如果要检查控制器属性,调用模型方法等等。
答案 1 :(得分:0)
有时你需要有一个类并扩展另一个继承类。像这样:
class Car extends Garage {
// properties and functions
}
但在 Codeigniter 中,您必须扩展 CI_Controller
以加载库,帮助程序等。
要同时使用(在加载CodeIgniter的本机资源旁边扩展自己的类),可以使用超级对象。一个例子:
class Car extends Garage {
protected $CI;
// We'll use a constructor, as you can't directly call a function
// from a property definition.
public function __construct()
{
// Assign the CodeIgniter super-object
$this->CI =& get_instance();
}
public function foo()
{
$this->CI->load->helper('url');
redirect();
}
public function bar()
{
$this->CI->config->item('base_url');
}
}
请参阅here:
在某些情况下,您可能希望开发除控制器之外的类,但能够使用所有CodeIgniter的资源。您可以很容易地看到这一点。