警告: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->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->config
是null
(尚未被赋予值的对象属性的默认值),那么第二个将意味着不满足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->config) < 1)
...将变为:if (sizeof($this->config ?? []) < 1)
。
【讨论】:
以上是关于警告:sizeof():参数必须是数组或实现可数php7.2的对象的主要内容,如果未能解决你的问题,请参考以下文章
Woocommerce - sizeof():参数必须是数组或实现 Countable 的对象
Mysql Dump : count() 参数必须是实现可数对象的数组
PHP 警告:count(): 参数必须是数组或实现 Countable 的对象
MYBB 警告 [2] count():参数必须是数组或实现 Countable 的对象 - 行:906