【问题标题】:How to automatically load classes without debug_backtrace()如何在没有 debug_backtrace() 的情况下自动加载类
【发布时间】: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');

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

  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

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-&gt;getTrace(),但随后您将抛出一个也不漂亮的无用异常。见Exception

标签: php backtrace autoloader spl-autoload-register php-include


【解决方案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');

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多