10

答えはイエスだと思いますが、レガシーコードで次のことをよく見ました。私は自分自身を疑っています。コミュニティに健全性チェックをお願いしています。

レガシーコード

if (is_null($result) || !$result) {

リファクタリングされたコード

if (!$result) {

注:が設定されていない場合、これにより通知がスローされることを認識して$resultいます。

質問

このコードは論理的に同等ですか?

コードテスト

Not equal for ...を受け取らずに、 PHPのfalse値のすべての組み合わせでテストしました。

$false_values = array(false, 0, 0.0, '0', '', null, array(), new stdClass());

foreach ($false_values as $var) {
    if (!$var != (is_null($var) || !$var)) {
        echo 'Not equal for: ';
        var_dump($var);
    }
}

出力

$ php check.php
$
4

4 に答える 4

5

null変数はfalseブールコンテキストで評価されます。したがって、ステートメントは論理的に同等です。変数がnullの場合、!$resultステートメントによってキャッチされます。

empty()通知レベルの警告を防ぐために使用します。

if (!empty($result)) {
   // do something
}
于 2012-11-27T16:51:48.467 に答える
4

はい、両方のスニペットは同等です。is_nullは次のように定義されます。

varがnullの場合はTRUEを返し、それ以外の場合はFALSEを返します。

is_nullドキュメントでは、の単純なブール評価と同様に、変数が未定義の場合に警告がスローされることも明確になっています$result$resultが設定されていない場合is_null($result)はtrueであるため、警告が1つ表示されます。これは。の場合と同じ動作です!$result

NULLのブール評価は(当然のことながら)falseであるため、すべての興味深い値を簡単にテストできます。

$result  is_null($result)  !$result   is_null($result) || !$result
(unset)   true(+warn)     true(+warn)          true (+warn)
null         true            true              true
false(-y)    false           true              true
true(-ish)   false           false             false

is_nullとの結果は、falseと評価されるすべての値、および!$resulttrueと評価されるすべての値で同一であることに注意してください。0したがって、それ以上の区別(たとえば、テスト""などによる)は必要ありません。

于 2012-11-27T16:54:55.057 に答える
1

http://php.net/is_nullのため、呼び出しis_null($var)はとまったく同じである必要があります$var === NULL

テスト!$varでは値をテストするため、null、空、存在しない/設定されていない、またはゼロの値はブール値falseに変換され、その他の値はブール値trueに変換されます。

(is_null($result) || !$result)したがって、 whileを呼び出すと、次$resultのようになります$false_values

false          : (is_null(false) || !false)      => (false || true) => true
0              : (is_null(0) || !0)              => (false || true) => true
0.0            : (is_null(0.0) || !0.0)          => (false || true) => true
'0'            : (is_null('0') || !'0')          => (false || true) => true
null           : (is_null(null) || !null)        => (true || true)  => true
array()        : (is_null(array()) || !array())  => (false || true) => true
new stdClass() : (is_null(new cls) || ! new cls) => (false || true) => true

あなたのテスト!$varでのテストは常にそれであるはずですのでtrue それは非常に大丈夫ですあなたは得られませんでしNot equal forた。

通知を避けたい場合は、次のテストを使用できます。

if(isset($var) && $var) echo 'true story';

また

if(!isset($var) || !$var) echo 'this happens if false or not set at all';
于 2012-11-27T16:56:38.667 に答える
0

コードは論理的に次のものと同等です。

is_null(null) === true
and
!null === true

はい、そしてleepowersが言ったように使用empty()

于 2012-11-27T16:54:42.663 に答える