0

现在我不是最伟大的 Code Igniter 人,但我正在寻找一种方法来创建其他核心类。我的代码没有扩展当前核心的目的,也没有将其创建为控制器的用途。

是否有某个地方指定了要自动加载的内容?我从一个非常基本的文件开始Application/core/world.php

Class CI_Worlds{

    function __construct(){
        die('this is the end of the world');
    }
}

?>

尝试使用$this->load->library('Worlds'); Have 访问它还尝试了类名的其他替代方法。

4

2 回答 2

3

所有自动加载的文件都在config/autoload.php. 如果您想创建一个全新的类,请将其放在库目录中。

如果你想自动加载它,打开config/autoload.php并在 $autoload['libraries'] 下包含类名:

$autoload['libraries'] = array('CI_Worlds');
于 2012-11-05T01:04:10.257 回答
0

通过自动加载类$autoload[...]有一个小缺点:类的对象会自动实例化,并且可以使用->class_namefrom CI ,,superobject'' 访问(请查看Loader::_ci_autoloader()system/core/Loader.php。可访问性并不优雅,但实例化可能是不需要的或不必要的。

这是我的解决方案:

归档MY_Loader.php_application/core

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Loader extends CI_Loader
{
  const MY_AUTOLOADER_CONFIG = 'my_autoloader';

  /******************************************************************************************/

  private $search_paths = array();

  /******************************************************************************************/

  private function register_autoloader(array $search_paths)
  {
    foreach($search_paths as $path)
      if ($path = realpath($path))
        $this->search_paths[] = $path;

    if (empty($this->search_paths))
      throw new LogicException('Autoloader search_paths does not contain any valid path');
    else
      spl_autoload_register(array($this, 'autoloader'));
  }

  /**
    * Based on idea from http://www.highermedia.com/articles/nuts_bolts/codeigniter_base_classes_revisited
    */
  private function autoloader($class_name)
  {
    if (!class_exists($class_name, false)) // false == no autoload ;)
      foreach($this->search_paths as $path)
      {
        $file_name = $path.DIRECTORY_SEPARATOR.$class_name.'.php';
        if (file_exists($file_name))
          include_once($file_name);
      }      
  }

  /******************************************************************************************/

  /**
    * extension of CI_Loader::_ci_autoloader()
    */
  protected function _ci_autoloader()
  {
    $config = load_class('config', 'core');
    if ($config->load(self::MY_AUTOLOADER_CONFIG, TRUE, TRUE))
      $this->register_autoloader(
        $config->item('search_paths', self::MY_AUTOLOADER_CONFIG)
      );

    parent::_ci_autoloader();
  }

}

还有一个例子config/my_autoloader.php

<?php

$config['search_paths'] = array(
  APPPATH.'core'
);

此代码中包含的类不会自动实例化。

另外值得记住一些缺点:如果加载了此代码的类也加载了 CI 代码的某个地方,则 CI 可能会失败。或者换句话说:必须保持文件和类不相互干扰。

于 2015-08-26T12:41:59.027 回答