如何在没有debug_backtrace()的情况下自动加载类

时间:2014-04-07 10:52:21

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

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

<?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');
  3. 在这两种情况下,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');
    

    更新2

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

1 个答案:

答案 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');