PHP if()不返回true,也不调用所有元素

PHP if()不返回true,也不调用所有元素,php,Php,我有以下代码部分: if (($product->uploadable_files != $files_count || $product->text_fields != $text_count) && !count($this->errors) && !$product->update()) $this->errors[] = Tools::displayError('An error occurred while

我有以下代码部分:

if (($product->uploadable_files != $files_count || $product->text_fields != $text_count) && !count($this->errors) && !$product->update())
        $this->errors[] = Tools::displayError('An error occurred while updating the custom configuration.');
为什么(我完全迷路了)它不调用
Tools::displayError
也不调用
$product->update()


最后,应该调用其中一个。事实并非如此

&&检查两者是否均为真。如果第一个是假的,它就到此结束,不去其他任何地方,正如手册所说,这是一个短路。| |也一样


&&检查两者是否都为真。如果第一个是假的,它就到此结束,不去其他任何地方,正如手册所说,这是一个短路。| |也一样


这可能意味着它甚至没有达到这一点。可以将if语句分为三组:

第一:
$product->可上传的文件!=$文件计数| |$product->文本字段!=$文本计数

第二:
!计数($this->errors)

第三:
$产品->更新()

如果其中一个组为false,则整个条件将为false。如果第一个是假的,它甚至不会到达第二个和第三个。如果第二个为假,它不会到达第三个


而且,永不返回false。您可能正在检查
$this->errors
是否为空,因此只需使用
empty($this->errors)
这可能意味着它甚至没有达到该点。可以将if语句分组为三组:

第一:
$product->可上传的文件!=$文件计数| |$product->文本字段!=$文本计数

第二:
!计数($this->errors)

第三:
$产品->更新()

如果其中一个组为false,则整个条件将为false。如果第一个是假的,它甚至不会到达第二个和第三个。如果第二个为假,它不会到达第三个


而且,永远不要返回false。您可能正在检查
$this->errors
是否为空,因此只需使用
empty($this->errors)
来扩展treegarden的答案, 如果处理不当,
count()
可以计算为true

var_dump(count([]));            # 0
var_dump(count([]) == false);   # true
var_dump(count([]) === false);  # false
Count返回第一个参数中的元素数。如果参数不是具有实现的可数接口的数组或对象,则返回1。有一个异常,如果数组_或_countable为NULL,则返回0

而是使用
empty()


为了扩展treegarden的答案, 如果处理不当,
count()
可以计算为true

var_dump(count([]));            # 0
var_dump(count([]) == false);   # true
var_dump(count([]) === false);  # false
Count返回第一个参数中的元素数。如果参数不是具有实现的可数接口的数组或对象,则返回1。有一个异常,如果数组_或_countable为NULL,则返回0

而是使用
empty()


您能打印您正在测试的每个值吗?更改
!计数($this->errors)
计数($this->errors)>0
<代码>!0->true&&!1->false您可以打印您正在测试的每个值吗?更改
!计数($this->errors)
计数($this->errors)>0
<代码>!0->true&&!1->false右侧。。我的错。我想它应该像
|
那样运行,并且应该检查所有条件。我错了&&和| |。对。。我的错。我想它应该像
|
那样运行,并且应该检查所有条件。我弄错了&&和| |。它仍然没有返回他说的^^^是的,你是对的,尽管它仍然没有返回false,并且正在检查!0绝对是一种糟糕的做法。这是Prestashop中的常见做法。我没有写这段代码。从1.6.1.0开始。另外,
count()
返回整数类型,而不是布尔值。所以
==
在这里是不够的,除非将其转换为布尔值,否则它永远不会为真。我知道它返回一个整数类型。我只提到它可以根据计算结果返回false,没有说布尔类型:)。正如treegarden所说(我也同意),使用count over empty(在本例中)是一种不好的做法,而且执行速度也较慢。它仍然不会返回
false
他所说的^^^Yes你是对的,尽管它仍然不会返回
false
,并检查!0绝对是一种糟糕的做法。这是Prestashop中的常见做法。我没有写这段代码。从1.6.1.0开始。另外,
count()
返回整数类型,而不是布尔值。所以
==
在这里是不够的,除非将其转换为布尔值,否则它永远不会为真。我知道它返回一个整数类型。我只提到它可以根据计算结果返回false,没有说布尔类型:)。正如treegarden所说(我也同意),使用countoverempty(在本例中)是一种不好的做法,而且执行速度也较慢。
var_dump(!empty([])); # false