【问题标题】:Creating new core classes (not replacing)创建新的核心类(不替换)
【发布时间】:2012-11-05 00:59:22
【问题描述】:

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

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

Class CI_Worlds{

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

?>

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

【问题讨论】:

    标签: php codeigniter core


    【解决方案1】:

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

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

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

    【讨论】:

    • 完全正确。 CI 框架之外的新类进入库。破解核心只会使升级变得更加困难,并且您会失去围绕处理库构建的所有功能(如自动加载)。
    【解决方案2】:

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

    这是我的解决方案:

    application/core 中的文件 MY_Loader.php

    <?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 可能会失败。或者换句话说:必须保持文件和类不相互干扰。

    【讨论】:

      猜你喜欢
      • 2021-10-31
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2023-02-03
      相关资源
      最近更新 更多