1

いくつかのコードをデバッグしていたところ、

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

どちらも $field を TRUE 値に設定する必要があります。しかし、何らかの理由で意図したとおりに動作しません。最初の 1 つは true を返し、もう 1 つは false を返します。

Edit1: 質問を書いているときに、うっかり間違えてしまいました。それが違う理由です。

Edit2:この動作は2つの異なるサーバーで異なるため、質問します。2番目の例はTrueを返すことが期待されていますが、どういうわけかサーバーの1つでtrueを返しません。

Edit3: これが実際のコードです。Prestashop 1.5 の class/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[$id_language] の代わりに $this->$field を使用する必要があります。ただし、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] = '';
}

このようにして、パーサーが処理すべきと考える順序ではなく、定義した順序でさまざまな句と演算子を評価するようにパーサーに強制します。

元の回答

=== 演算子は 2 つの値を比較し、同じ値と同じ型の両方が含まれている場合は true を返すため、$field は true に設定されています。

$id を null に設定すると、基本的に次のように実行されます。

$field = (null === null);

次のように、現在のコードを拡張してロジックを明確にすることができます。

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

または、単に実行することもできます:

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