PHP には、関数を使用するときに (int)0 と (string)"0" を空として評価する習慣がありempty()
ます。数値または文字列の値が 0 であると予想される場合、意図しない結果が生じる可能性があります。空のオブジェクト、配列、文字列などに対してのみ true を返すように「修正」するにはどうすればよいですか?
13 に答える
これは私にはうまくいきませんでした。
if (empty($variable) && '0' != $variable) {
// Do something
}
代わりに使用しました:
if (empty($variable) && strlen($variable) == 0) {
// Do something
}
empty()
あなたが説明した理由で私はめったに使用しません。正当な価値観と空虚さを混同します。SQL で多くの作業を行っているためかもしれませんがNULL
、値がないことを示すために使用することを好みます。
PHP にはis_null()
、変数または式が であることをテストする関数がありますNULL
。
$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n";
else print "integer 0 foo is not null!\n";
$foo = "0";
if (is_null($foo)) print "string '0' is null!\n";
else print "string '0' is not null!\n";
$foo = "";
if (is_null($foo)) print "string '' is null!\n";
else print "string '' is not null!\n";
$foo = false;
if (is_null($foo)) print "boolean false is null!\n";
else print "boolean false is not null!\n";
===
同様のテストを行うために、正確に等しい演算子を使用することもできます。
if ($foo === null) print "foo is null!\n";
これは が の場合は true です$foo
が、 、ゼロ、などNULL
の場合は当てはまりません。false
""
PHP では、 「0」は常に false (または空) と見なされます。ゼロも true に評価する場合は、 を使用しますstrlen($value)
。
私は常に自分のコードベースに追加します
function is_blank($value) {
return empty($value) && !is_numeric($value);
}
empty() の代わりに使用します。ゼロ (int、float、または string) を空でないものとして保持するという問題を解決します。
2011 年 5 月に追加されたhttp://www.php.net/manual/en/function.empty.php#103756を参照してください。
一般的に言えば、トリプル イコール演算子を使用して、値が本当に null か false かを判断します。これはより具体的であり、結果は常に期待どおりに正確に返されます。
1 行のコードで実行できることを実行する別の関数を作成するのに、別の演算子を使用すると、非常に複雑になり、さらに難読化が追加されます。
さらに、多くのプログラマーは、存在しない値を示すために 0 または空の文字列を使用する傾向がありますが、真に存在しない値 (型に関係なく) を示すために null 値を使用する方がより正確です (そして私はより良い習慣だと感じています)。 -存在します。
「固定」は一つの視点です。もう 1 つは、「壊れていない」と想定し、意図的に設計された方法で操作する方法を学ぶことです。
あなたが説明した問題を考えると、変数が不確定な型の状態にならないようにコードを強化するのが最善の方法です。それ以外の場合は、gettype() を使用してデータ型をテストする必要があります。
あなたはempty()
それが意図されていない何かのために使用しようとしています。個人的には、この動作はPHPの古いプログラミングパラダイムに由来するものであり、おそらく廃止される可能性があると思います。
代わりに、チェックをより明確にします。値が役に立たないかどうかを確認するのではなく、役に立ったかどうかを確認します。たとえば、配列が必要な場合はis_array()
、文字列であるかどうかを確認するのではなく、配列()であるかどうかを確認します。
$_POST
また、すべての変数と変数が文字列であるという事実に依存$_GET
できるため、「」と比較したり、それを確認したりできstrlen() == 0
ます。
これを使用して空を検出します。
'' --> true
'0' --> false
0 --> false
関数:
function is_empty_or_zero($str) {
return (is_null($str) || ($str === ''));
}
if ( is_int($val) || !empty($val) ) {;}
IsEmpty()
簡潔なクイック関数を作成しました。
function IsEmpty($mData) {
return is_int($mData) ? false :
is_string($mData) ? $mData=="" :
empty($mData);
}
関数を使用ord
して、渡された値が空かどうかを確認しました。
/*
* SPACE is not empty - Please do trim before using this function for your own purpose
* var_dump(is_having_value(0)); // true
var_dump(is_having_value(0000)); // true
var_dump(is_having_value(" 0")); // true
var_dump(is_having_value("")); // false
var_dump(is_having_value(" ")); // true
var_dump(is_having_value('\t')); // true
var_dump(is_having_value('')); // false
var_dump(is_having_value('o')); // true
var_dump(is_having_value('O')); // true
var_dump(is_having_value('0')); //true
var_dump(is_having_value(null)); //false
var_dump(is_having_value()); //false
*/
function is_having_value($val = null) {
if (is_array($val) || is_object($val)):
$logic_empty = empty($val);
return !$logic_empty;
else:
$ascii = ord($val);
if ($ascii == 48 || $ascii = 0 || $ascii == 32):
return true;
else:
$logic_empty = empty($val);
return !$logic_empty;
endif;
endif;
}
この問題の最も効果的な解決策は、変数が false かどうかをテストすることです。
if (!$variable_name) {echo $variable_name;}
変数が空か null かは関係ありません。if 条件に入れると、すべて false になります。