1

我只是在调试一些代码,发现

$id = null;
$field = $id === null ? true : false;
$field = $id ? true : false;

两者都应将 $field 设置为 TRUE 值。但是由于某种原因,它不能按预期工作。第一个返回真,另一个返回假。

Edit1:我在写问题时不小心弄错了东西。这应该是它不同的原因。

Edit2:我问我的问题,因为这种行为在 2 个不同的服务器上是不同的。预计第二个示例将返回 True,但不知何故,它在我的一台服务器上没有返回 true。

Edit3:这是真正的代码。Prestashop 1.5 中的类/ObjectModel.php

/* Copy the field, or the default language field if it's both required and empty */
        if ((!$this->id_lang AND isset($this->{$field}[$id_language]) AND !empty($this->{$field}[$id_language])) 
        OR ($this->id_lang AND isset($this->$field) AND !empty($this->$field)))
            $fields[$id_language][$field] = $this->id_lang === null ? pSQL($this->$field) : pSQL($this->{$field}[$id_language]);
        elseif (in_array($field, $this->fieldsRequiredLang))
            $fields[$id_language][$field] = $this->id_lang === null ? pSQL($this->$field) : pSQL($this->{$field}[Configuration::get('PS_LANG_DEFAULT')]);
        else
            $fields[$id_language][$field] = '';

预期的行为(在大多数服务器上都是如此)是如果 $this->id_lang 设置为 null,那么应该使用 $this->$field 而不是 $this->$field[$id_language]。但是,在我在 CentOS 机器上设置的服务器上,这种行为有所不同,当值设置为 null 时,它会将 $this->$field[$id_language] 作为值。

4

2 回答 2

4

该声明(不幸的是您已编辑)与以下内容相同:

$id = null;
if($id === null) {
    $field = true;
} else {
    $field = false;
}

你还在期待虚假吗?:)

您问题中的陈述是使用所谓的三元运算符。要了解您的示例,您应该阅读本文档(部分:三元运算符

三元运算符是 if 语句的简写,它允许缩短代码,尤其是条件赋值。但是,您问这个问题的事实是它的缺点的一个很好的例子:它的可读性较差;)

于 2013-04-10T21:54:11.427 回答
3

关于编辑 3,如果您在具有相同代码和数据集的不同发行版上遇到不同的结果,那么我的猜测是您使用的 CentOS 二进制文件已被他们的开发人员修改并引入了一个错误,可能是在运算符优先级上。

作为一般规则,我个人更喜欢将每个子句或一组子句括在括号中,以减少发生这种情况的机会,因此我建议尝试以下方法:

if ((!$this->id_lang && isset($this->{$field}[$id_language]) && !empty($this->{$field}[$id_language])) || ($this->id_lang && isset($this->$field) && !empty($this->$field))) {
    $fields[$id_language][$field] = (($this->id_lang === null) ? pSQL($this->$field) : pSQL($this->{$field}[$id_language]));
} else if (in_array($field, $this->fieldsRequiredLang)) {
    $fields[$id_language][$field] = (($this->id_lang === null) ? pSQL($this->$field) : pSQL($this->{$field}[Configuration::get('PS_LANG_DEFAULT')]));
} else {
    $fields[$id_language][$field] = '';
}

这样,您强制解析器按照您定义的顺序评估各种子句和运算符,而不是解析器认为它们应该被处理的顺序。

原始答案

$field 被设置为 true,因为 === 运算符比较两个值,如果它们包含相同的值和相同的类型,则返回 true。

通过将 $id 设置为 null,您实际上是在运行:

$field = (null === null);

您可以扩展当前代码以阐明逻辑,如下所示:

if ($id === null) {
    $field = true;
} else {
    $field = false;
}

或者,您可以简单地运行:

$field = ($id === null);
于 2013-04-10T21:58:18.583 回答