【问题标题】:Autoload success/failure when calling class_exists调用 class_exists 时自动加载成功/失败
【发布时间】:2014-05-10 09:52:16
【问题描述】:

是否知道调用class_exists时自动加载器是否成功?

【问题讨论】:

  • 1.不要传递第二个参数或传递false 2。然后检查class_exists 返回的内容。 ?

标签: php class autoload


【解决方案1】:

就在自动加载器结束时检查类是否存在。

function __autoload($className) {

    //Your code here

    if(class_exists('You_Class', false)) {
        //succeed
    } else {
        //failure
    }
}

【讨论】:

  • 如果class_exists 不会调用自动加载器。所以你的代码是高度冗余的。
  • @php-dev 所以我必须运行class_exists 两次?一次自动加载(如果有自动加载器),一次检查自动加载器是否成功?
  • @thisispiers,对不起,不需要第二次调用只需检查class_exists的返回值
  • @php-dev so class_exists 查看自动加载是否成功,然后检查该类是否存在?我没有看到这种行为记录在案。
  • class_exists,取决于默认设置为 true 的第二个参数,检查类是否存在,如果不存在则尝试自动加载它。如果在使用第二个参数 = true 或省略时调用 class_exists 时该类不存在,您应该考虑自动加载器失败
【解决方案2】:

您必须检查class_exists 两次。

  1. 必要时自动加载
  2. 查看自动加载后类现在是否存在

我的工作代码是:

$autoload = spl_autoload_functions() ? true : false; // spl_autoload_functions can return array, empty array or false, but we need boolean
$should_include = $autoload ? class_exists($className, true) : true;

if($should_include && !class_exists($className, false)){ // make sure the class does not exist before including
    if(is_readable($fileName)){
        include_once($fileName);
    } else {
        throw new Exception('Could not include ' . $className);
    }
}

这会在回退之前尝试使用先前定义的自动加载器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2017-11-26
    • 2011-04-30
    • 1970-01-01
    • 2011-11-24
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多