4

我正在研究代码点火器。我遇到了这个超级物体。

代码点火器具有加载类并将它们存储在实例变量中的功能。每次我们需要包含一个新类或之前加载的类时,代码点火器首先在实例数组中搜索它,如果没有找到,则加载它并包含在实例数组中。

我的问题是在课堂上,当我们可以通过 load_class 函数包含类时(因为这个函数首先在实例数组中搜索,所以减少了一次又一次包含同一个类的开销,)那么声明超级对象包含预定义或加载的需要是什么新课程。

我们什么时候可以做到这一点。

class CLASSNAME
{
  function functionname()
  {
     $object = load_class(classname, location);
     $object->callfunction();
  }
}

那么为什么我们需要这样做

class CLASSNAME
{
  function functionname()
  {
    $superobject = & get_instance();
    $superobject->classobject->function(); 
  }
}

只想知道使用超级对象的好处。它只是包含所有预定义的对象,还是我无法理解的更深入和有益的东西。

提前致谢。

4

2 回答 2

0

在您给出的示例中(如果您只需要对库的引用) - 没有任何好处。get_instance()只是一个更常见(和记录)的功能,而load_class()仅供内部使用。

可能的好处是get_instance()让您可以访问控制器拥有的所有内容,例如,如果您想检查控制器属性、调用模型方法等。

于 2012-12-10T14:36:11.453 回答
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');
    }
} 

这里

在某些情况下,您可能希望开发与控制器不同但能够利用所有 CodeIgniter 资源的类。如您所见,这很容易实现。

于 2016-01-17T21:06:18.630 回答