现在我不是最好的Code Igniter人,但我正在寻找一种方法来创建其他核心类。我的代码没有扩展当前核心的目的,也没有用它来创建它作为控制器。
是否有某个地方指定了要自动加载的内容?
我从一个非常基本的文件Application/core/world.php
开始
Class CI_Worlds{
function __construct(){
die('this is the end of the world');
}
}
?>
尝试使用$this->load->library('Worlds');
访问它
还尝试了其他类名的替代方案。
答案 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可能会失败。换句话说:一个人必须保持文件和类不会相互干扰。