【问题标题】:class_exists fails to detect undefined classclass_exists 未能检测到未定义的类
【发布时间】:2017-02-03 15:50:58
【问题描述】:

我收到一个未定义特定类的 PHP 错误(当我引用成员方法时),在某些情况下未定义是可以的。所以我创建了一个 IF 语句,首先检查该类是否存在,然后检查其方法是否存在。现在我的 IF 语句正在生成错误。这是 IF 语句:

$visitordataavailable = ((isset($_SESSION['VISITOR'])) && (class_exists("Visitor",false)) && method_exists($_SESSION['VISITOR'],'toArray'));

这是错误:

致命错误:method_exists():脚本试图执行方法或访问不完整对象的属性。请确保类定义“访客” unserialize() 被调用或提供 __autoload() 函数以在...中加载类定义之前加载了您尝试操作的对象。

这怎么会产生错误!? class_exists 返回 true 表示“Visitor”类存在,但 method_exists 崩溃,因为未定义类“Visitor”。 “定义”的类与“存在”的类不同吗?

我在这里做错了什么?

【问题讨论】:

  • Myabe 类定义存在,但你真的在$_SESSION['VISITOR'] 中有它的实例吗?有__wakeup() __sleep() 的班级吗?最好再做一次is_object($_SESSION['VISITOR']) 检查
  • class_exists() 如果 PHP 可以找到类(包括/必需,使用自动加载等),则返回 true。它不会在会话变量中告诉您任何有关它的当前状态的信息。
  • JustOnUnderMillions:is_object 像我希望的那样工作!你能解释一下一个变量如何保存一个对象,PHP 识别出该对象的类存在,但是 is_object 是假的吗?

标签: php class error-handling


【解决方案1】:

您需要实例化类并将对象传递给 method_exists,或者使用 is_callable 并传递一个包含类名和方法名的数组。您必须在类名中包含任何命名空间。所以试试

    isset($_SESSION['VISITOR']) && class_exists("Visitor",false) 
     && is_callable(array('Namespace\Here\'.$_SESSION['VISITOR'],'toArray'))

如果您没有命名空间,请使用

    isset($_SESSION['VISITOR']) && class_exists("Visitor",false) 
         && is_callable(array($_SESSION['VISITOR'],'toArray'));

编辑: 考虑一下,您可能可以省略 class_exists,因为它隐式包含在 is_callable 检查中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2023-03-22
    • 2015-02-24
    • 1970-01-01
    • 2020-05-25
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多