我写了一个小系统,它自动加载来自同一目录的类,在该目录中需要该类的文件。
<?php
function load_class($class_name, $backtrace_level = 1)
{
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $backtrace_level);
$backtrace = array_pop($backtrace);
include_once dirname($backtrace['file']) . '/' . $class_name . '.php';
}
function class_autoloader($class_name)
{
load_class($class_name, 3);
}
spl_autoload_register('class_autoloader');
现在我可以通过两种方式包含课程:
$test_obj = new Base_class;
或Test_class extends Base_class
load_class('Base_class');
在这两种情况下,Base_class
都应该包含在需要它的同一目录中。
E.g。
档案 /application/models/Extendend_class.php
<?php
class Extended_class extends Base_class {
/* class code... */
}
应自动包含 /application/models/Base_class.php
Some say(我完全同意他们的观点)在生产代码中使用debug_backtrace()是一种不好的做法,所以问题是:有一种方法可以实现类似的行为没有那个功能?
提前致谢。
P.S。
This是我正在处理的实际脚本。
我按照建议尝试了一个空的尝试 - 捕获并且它有效!它可能不是“最干净”的解决方案,但它有效......
function load_class($class_name, $backtrace_level = 0)
{
try
{
throw new Exception();
}
catch (Exception $e) {}
$backtrace = $e->getTrace();
$backtrace = $backtrace[$backtrace_level];
include_once dirname($backtrace['file']) . '/' . $class_name . '.php';
}
function class_autoloader($class_name)
{
load_class($class_name, 2);
}
spl_autoload_register('class_autoloader');
自动加载类的最佳方法可能是通过名称空间 This是一个示例实现。
答案 0 :(得分:1)
究竟他怎么评论@ h2ooooooo你可以尝试捕捉异常,并知道从哪里来的错误
function load_class($class_name, $backtrace_level = 1)
{
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $backtrace_level);
$backtrace = array_pop($backtrace);
if (file_exists(dirname($backtrace['file']) . '/' . $class_name . '.php')) {
include_once dirname($backtrace['file']) . '/' . $class_name . '.php';
} else {
exit ('The file ' .dirname($backtrace['file']) . '/' . $class_name . '.php' . ' is missing in the path file.');
}
}
function class_autoloader($class_name)
{
load_class($class_name, 3);
}
spl_autoload_register('class_autoloader');