有没有办法列出 CodeIgniter 实例的所有当前加载的库和助手?
而不是用 $this->load->is_loaded($item) 来比较每一个 ??
这最好在 CodeIgniteir Core 本身内进行管理。因为它仔细检查映射到单例对象的库属性的实例,
CI_Controller
。这些库和助手由受保护的实例管理(分别为$_ci_classes
和$_ci_helpers
)
否则,您需要改进添加到单例对象中的内容。
CI_Controller
包括 $this
共享实例的库、模型和加载器 - 因此识别加载的“库”或未加载的内容是很棘手的。
/**
* Example Controller
**/
class Home extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
/*
* Fetch a List of Non-core Libraries loaded at $this.
*
* @var array $ci_libraries
*/
public function list_of_libraries()
{
$ci_libraries = [];
foreach( (array) get_object_vars( $this ) as $libraryName => $classObj )
{
//Is it a Core Class?
$className = get_class( $classObj );
if ( stripos( $className, "CI_" ) === false &&
stripos( $className, "MY_" ) === false )
{
$ci_libraries[$libraryName] = $className;
}
}
return $ci_libraries;
}
/*
* Fetch a list of included Helper files & strip out the .php extension
*
* @var array $ci_helpers
*/
public function list_of_helpers()
{
$ci_helpers = array_filter( array_map(function( $file ){
return stripos( $file, "_helper.php" ) !== false ?
basename( $file, ".php" ) : false;
}, get_included_files() ));
return $ci_helpers;
}
}
尽管正如我之前提到的 - 我确实相信这对您原来的问题来说是过度设计,但
$this->load->is_loaded()
是一个很好的解决方案。
我刚刚能够在 PHP 7.4 上运行的 CodeIgniter 3.1.11 中实现以下内容。
var_export(
(fn() => $this->_ci_classes)->call($this->load)
);
这是一个“立即调用函数表达式”,它利用
call()
“魔术方法”来访问protected
_ci_classes
数组。
如果该房产具有
public
可见性,您只需致电 $this->load->_ci_classes
。
这将输出已加载库的关联数组,其中键是库对象别名,值是原始库名称。
您可能会看到类似以下内容:
array (
'benchmark' => 'Benchmark',
'hooks' => 'Hooks',
'config' => 'Config',
'log' => 'Log',
'utf8' => 'Utf8',
'uri' => 'URI',
'router' => 'Router',
'output' => 'Output',
'security' => 'Security',
'input' => 'Input',
'lang' => 'Lang',
'loader' => 'Loader',
'AuthLib' => 'Auth',
'session' => 'Session',
'mongo' => 'Mongo_db',
'SomeLib1' => 'SomeLib',
'SomeLib2' => 'SomeLib',
'SomeLib3' => 'SomeLib',
)
最后三个条目将像这样加载:
$this->load->library('SomeLib', null, 'SomeLib1');
$this->load->library('SomeLib', null, 'SomeLib2');
$this->load->library('SomeLib', null, 'SomeLib3');