我编写了一个小系统,它会自动从需要该类的文件所在的同一目录加载类。
<?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');
现在我可以通过两种方式包含类:
- 通过 spl_autoload_register():
$test_obj = new Base_class;
或者Test_class extends Base_class
- 通过 load_class():
load_class('Base_class');
在这两种情况下,Base_class
都应该包含在需要它的同一目录中。
例如
文件/application/models/Extendend_class.php
<?php
class Extended_class extends Base_class {
/* class code... */
}
应该自动包含/application/models/Base_class.php
有人说(我非常同意他们)在生产代码中使用 debug_backtrace() 是一种糟糕的做法,所以问题是:有没有办法在没有该功能的情况下实现类似的行为?
提前致谢。
PS
这是我正在处理的实际脚本。
更新
我按照建议尝试了一个空的 try - catch 并且它有效!它可能不是“最干净”的解决方案,但它有效......
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');
更新 2
自动加载类的最佳方式可能是通过命名空间。
这是一个示例实现。