警告:sizeof():参数必须是数组或实现 Countable php7.2 的对象
Warning: sizeof(): Parameter must be an array or an object that implements Countable php7.2
我更新到 PHP 7.2,它创建了一个问题数组(没有双关语意)。我一直在消除它们(主要是这些 sizeof 和 count() 警告。我们遇到的一个错误:
Warning: sizeof(): Parameter must be an array or an object that implements Countable in /usr/www/domain/phpmyd/includes/class_registry.php on line 236
我试过这样修复它:
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))) {
去掉基本相同的错误。现在,请记住,上面的警告是唯一剩下的错误。其他一切都完美无缺,但是,如果我执行 "fix" 警告,我会收到一堆错误,这些错误会破坏网站并且看起来无关紧要。因此,如果我替换第一个字符串,则会出现所有这些错误:
- 警告:使用未定义常量ADDON_DISCOUNT_CODES - 假设
'ADDON_DISCOUNT_CODES'(这会在未来的版本中抛出错误
PHP) 在 /usr/www/domainlistings/phpmyd/index.php 第 6
行
- 警告:使用未定义常量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
;) 廉价改进 - 总是少一个操作码。
其次,确保你传递的是一个数组,而不是 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;
}
我认为这里发生的事情是您最初所做的更改确保 loadConfig()
永远不会发生,并且 loadConfig()
中的某些内容负责定义您在更改后收到警告的所有常量那。
如果你改变了
if (sizeof($this->config) < 1) {
到
if (!empty($this->config) &&(sizeof($this->config) < 1)) {
那么如果 $this->config
是 null
(对象 属性 的默认值还没有被赋值),那么第二个就意味着 if 条件会不满意,因为 null
是 空,在第一个中,它会满意,因为 sizeof(null)
仍然 returns 0 即使它给出你是无数个警告。
sizeof
在那里从来都不是真正必要的。你不必为了看它是否存在而数数。
我认为这应该可以正常工作,并且更能说明它的实际用途。
if (empty($this->config)) {
$this->loadConfig();
}
您可以在传递变量之前检查它是否为数组:
if(is_array($this->config)){
if(sizeof($this.config) < 1) {
// code here
}
}
这些天您可以使用 null coalescing operator (??) 来帮助解决这种情况;即,如果给定值不为空,则使用它来获取给定值,或者当给定值为空时,使用它来获取空数组。
所以你的代码:if (sizeof($this->config) < 1) {
...会变成:if (sizeof($this->config ?? []) < 1) {
.
我更新到 PHP 7.2,它创建了一个问题数组(没有双关语意)。我一直在消除它们(主要是这些 sizeof 和 count() 警告。我们遇到的一个错误:
Warning: sizeof(): Parameter must be an array or an object that implements Countable in /usr/www/domain/phpmyd/includes/class_registry.php on line 236
我试过这样修复它:
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))) {
去掉基本相同的错误。现在,请记住,上面的警告是唯一剩下的错误。其他一切都完美无缺,但是,如果我执行 "fix" 警告,我会收到一堆错误,这些错误会破坏网站并且看起来无关紧要。因此,如果我替换第一个字符串,则会出现所有这些错误:
- 警告:使用未定义常量ADDON_DISCOUNT_CODES - 假设 'ADDON_DISCOUNT_CODES'(这会在未来的版本中抛出错误 PHP) 在 /usr/www/domainlistings/phpmyd/index.php 第 6 行
- 警告:使用未定义常量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
;) 廉价改进 - 总是少一个操作码。
其次,确保你传递的是一个数组,而不是 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;
}
我认为这里发生的事情是您最初所做的更改确保 loadConfig()
永远不会发生,并且 loadConfig()
中的某些内容负责定义您在更改后收到警告的所有常量那。
如果你改变了
if (sizeof($this->config) < 1) {
到
if (!empty($this->config) &&(sizeof($this->config) < 1)) {
那么如果 $this->config
是 null
(对象 属性 的默认值还没有被赋值),那么第二个就意味着 if 条件会不满意,因为 null
是 空,在第一个中,它会满意,因为 sizeof(null)
仍然 returns 0 即使它给出你是无数个警告。
sizeof
在那里从来都不是真正必要的。你不必为了看它是否存在而数数。
我认为这应该可以正常工作,并且更能说明它的实际用途。
if (empty($this->config)) {
$this->loadConfig();
}
您可以在传递变量之前检查它是否为数组:
if(is_array($this->config)){
if(sizeof($this.config) < 1) {
// code here
}
}
这些天您可以使用 null coalescing operator (??) 来帮助解决这种情况;即,如果给定值不为空,则使用它来获取给定值,或者当给定值为空时,使用它来获取空数组。
所以你的代码:if (sizeof($this->config) < 1) {
...会变成:if (sizeof($this->config ?? []) < 1) {
.