创建新的核心类(不替换)

时间:2012-11-05 00:59:22

标签: php codeigniter core

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

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

Class CI_Worlds{

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

?>

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

2 个答案:

答案 0 :(得分:3)

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

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

$autoload['libraries'] = array('CI_Worlds');

答案 1 :(得分:0)

通过$autoload[...]自动加载类有一点不利之处:类的一个对象会被自动实例化,并且可以通过CI中的->class_name访问,超级项目''(请查看Loader::_ci_autoloader() in 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可能会失败。换句话说:一个人必须保持文件和类不会相互干扰。