通过自动加载类$autoload[...]
有一个小缺点:类的对象会自动实例化,并且可以使用->class_name
from 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 可能会失败。或者换句话说:必须保持文件和类不相互干扰。