【发布时间】:2014-04-07 10:52:21
【问题描述】:
我编写了一个小系统,它会自动从需要该类的文件所在的同一目录加载类。
<?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
Some say(我非常同意他们)在生产代码中使用 debug_backtrace() 是一种糟糕的做法,所以问题是:有一种方法可以实现 类似 的行为,而无需这样做功能?
提前致谢。
P.S.
This 是我正在处理的实际脚本。
更新
我按照建议尝试了一个空的 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
自动加载类的最佳方式可能是通过命名空间。
This 是一个示例实现。
【问题讨论】:
-
您可以在空的
try..catch中抛出异常并使用$e->getTrace(),但随后您将抛出一个也不漂亮的无用异常。见Exception。
标签: php backtrace autoloader spl-autoload-register php-include