【问题标题】:PHP 7 - Expected an object instance when accessing an instance propertyPHP 7 - 访问实例属性时需要一个对象实例
【发布时间】:2022-10-09 06:04:06
【问题描述】:

我正在使用 PHP Phan 扫描一些代码并在升级前确保 PHP 7 兼容性。它报告了以下问题...

if(!empty($values->custom_field['section'][0]['value'])):

Expected an object instance when accessing an instance property, but saw an expression $values with type null

我不确定是什么导致了错误。我该如何解决?

【问题讨论】:

  • 你是如何初始化 $values 的?你在哪里做的?

标签: php


【解决方案1】:

$values 是一个对象,因为它需要有一个 custom_field 属性。出于某种原因,您的工具认为 $values 在这种情况下是 null

为什么会这样,我不知道。我已经看到这种情况发生在代码中,例如,

$values = null;
if (SOMETHING THAT SHOULD ALWAYS HAPPEN) {
    $values = functionReturningObject();
}
/*
if (null === $values) {
    throw new RuntimeException('Impossible error!');
}
*/
if (empty($values->property)) {
    ...
}

在上述情况下,有时显式测试对象的无效性或对象性足以消除警告。

在某些情况下,警告实际上是正确的:

$values = null;
switch ($flag) {
    case 0:
        $values = ...;
        break;
    case 1:
        $values = ...;
        break;
    case 2:
        $values = ...;
        break;
}

在上述情况下,该工具会警告您在不可预见的情况下默认在这种情况下,无论多么不可能,$values 将是 null

【讨论】:

  • 感谢您的解释,现在更有意义了。
【解决方案2】:

函数empty() 不关心它的参数是否已定义或是否有意义。如果$values 未定义或为空,empty 返回 false,但当它不是一个对象或它是一个没有 custom_field 属性的对象时也是如此。如果该属性存在但它不是一个数组,它也会返回 false。如果它是一个数组但没有键 section 它再次返回 false。

PhpStan 显示此消息是因为它认为 $values 为空。这可能是正确的,您必须检查代码以找到 $value 的定义/分配位置。但是由于它在empty 中使用它不会导致运行时问题。如果 $values 始终为空,那么检查只会使您的代码更加复杂。

【讨论】:

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