1

我编写了一个小系统,它会自动从需要该类的文件所在的同一目录加载类。

<?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');

现在我可以通过两种方式包含类:

  1. 通过 spl_autoload_register():
    • $test_obj = new Base_class;或者Test_class extends Base_class
  2. 通过 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

自动加载类的最佳方式可能是通过命名空间。
是一个示例实现。

4

1 回答 1

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');
于 2014-04-07T23:43:46.407 回答