警告:sizeof():参数必须是数组或实现可数php7.2的对象

Posted

技术标签:

【中文标题】警告:sizeof():参数必须是数组或实现可数php7.2的对象【英文标题】:Warning: sizeof(): Parameter must be an array or an object that implements Countable php7.2 【发布时间】:2020-03-15 13:47:27 【问题描述】:

我更新到 php 7.2,它创建了一个问题数组(不是双关语)。我一直在将它们淘汰(主要是这些 sizeof 和 count() 警告。我们遇到的一个错误:

警告:sizeof():参数必须是数组或对象,在 /usr/www/domain/phpmyd/includes/class_registry.php 第 236 行实现 Countable

我尝试这样修复它:if (sizeof($this->config) < 1) 致此:if (!empty($this->config) &&(sizeof($this->config) < 1))

但是它会产生更多的错误,如下所示,但是,我们以相同的方式修复了这个错误,并且效果很好。改变这个:if (0 < sizeof($this->language)) 致此:if (!empty($this->language) && (0 < sizeof($this->language)))

消除了基本相同的错误。现在,请记住,上面的警告是唯一剩下的错误。其他一切都完美无缺,但是,如果我“修复”警告,我会收到一堆错误,这些错误会破坏网站并且看起来无关紧要。所以,如果我替换第一个字符串,所有这些错误都会出现:

警告:使用未定义的常量 ADDON_DISCOUNT_CODES - 假定 'ADDON_DISCOUNT_CODES'(这将在未来的版本中引发错误 PHP) 在第 6 行的 /usr/www/domainlistings/phpmyd/index.php 中 警告:使用未定义的常量 ADDON_BLOG - 假定为“ADDON_BLOG” (这将在 PHP 的未来版本中引发错误) /usr/www/domainlistings/phpmyd/cp/template/default/admin_header.tpl 在第 134 行 警告:使用未定义的常量 ADDON_LINK_CHECKER - 假定 'ADDON_LINK_CHECKER'(这将在未来版本的 PHP) 在 /usr/www/domainlistings/phpmyd/cp/template/default/admin_header.tpl 第 179 行

那些错误没有出现,在我改变之前,这些东西运行良好 if (sizeof($this->config) < 1)

这是如何关联的?我不确定这里发生了什么,这条线如何制造或破坏这些其他(看似无关的)事情。初始问题的完整代码(第 236 行):

/**
     * Get a configuration value
     * @param string $key
     * @return mixed
     */
    public function getConfig($key) 
        if (sizeof($this->config) < 1) 
            $this->loadConfig();
        
        return isset($this->config[$key]) ? $this->config[$key] : false;
    

有什么想法吗?

【问题讨论】:

只是好奇:这里为什么需要 sizeof/count?一个简单的if (!$this-&gt;config) 有什么问题? OP 询问为什么这不起作用。 这是更新到 7.2 的常见问题,尤其是对于 contrib 模块/包。从 7.2.0 开始,如果传递一个 null 值,count 会抛出一个警告,它曾经默默地失败。例如php.net/manual/en/… @JDev518 没错,我已经修复了其中的十几个,但这一个似乎产生的后果大多没有关联,我不知道原因(或链接) . Emix 给了我一些思考! 【参考方案1】:

我认为这里发生的情况是,您最初所做的更改确保了 loadConfig() 永远不会发生,loadConfig() 中的某些内容负责定义您在更改后收到警告的所有常量。

如果你改变了

if (sizeof($this->config) < 1) 

if (!empty($this->config) &&(sizeof($this->config) < 1)) 

那么如果$this-&gt;confignull(尚未被赋予值的对象属性的默认值),那么第二个将意味着不满足if 条件,因为null 空的,在第一个中,它会被满足,因为sizeof(null) 仍然返回 0,即使它给了你不可数的警告。

sizeof 在那里从来没有真正必要。您不必为了查看它是否存在而数数。

我认为这应该可以正常工作,并且对于它的实际用途更有意义。

if (empty($this->config)) 
    $this->loadConfig();

【讨论】:

谢谢!这很有道理,我真的很感谢你把它分解成这样。肯定还有其他需要改进的地方,谢谢!【参考方案2】:

你可以在传递变量之前检查它是否是一个数组:

if(is_array($this->config))
   if(sizeof($this.config) < 1) 
       // code here
   

【讨论】:

【参考方案3】:

对于初学者来说,不要使用sizeof,而是使用count ;) 廉价的改进 - 总是少一个操作码。

其次,确保传递一个数组,而不是 null 或任何你在那里的数组,例如:

// dirty fix
if (count((array) $this->config) > 0) 
    …

要正确解决此问题,无论如何您都不应允许此属性为null。如果您在延迟加载后检查变量是否为 null 或不是数组,例如:

public function getConfig($key, $default = false)

    if (!is_array($this->config)) 
        // make sure it becomes one after the load
        $this->loadConfig();
    

    return $this->config[$key]) ?? $default;

【讨论】:

所以,第二部分没有错。这似乎是一种更有效的方法,但如果我实施这样的解决方案,它会引发相同的配置错误,不幸的是我们对原因一无所知,我将不得不真正考虑这一点。第一个修复确实会停止警告并且不会破坏配置。老实说,我对它的工作方式感到震惊,我们没有考虑过。你的两个答案都是有效的,我很感激!我【参考方案4】:

如今,您可以使用null coalescing operator (??) 在这种情况下提供帮助;即,如果它不为空,则使用它来获取给定的值,或者当给定的值为空时,使用一个空数组。

所以你的代码:if (sizeof($this-&gt;config) &lt; 1) ...将变为:if (sizeof($this-&gt;config ?? []) &lt; 1)

【讨论】:

以上是关于警告:sizeof():参数必须是数组或实现可数php7.2的对象的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce - sizeof():参数必须是数组或实现 Countable 的对象

Mysql Dump : count() 参数必须是实现可数对象的数组

PHP 警告:count(): 参数必须是数组或实现 Countable 的对象

MYBB 警告 [2] count():参数必须是数组或实现 Countable 的对象 - 行:906

PHP错误:警告:count():参数必须是实现Countable的数组或对象

PHP警告消息:count():参数必须是实现Countable的数组或对象[重复]