式は、のJohn-Adams == Alice
ように解析され(John - Adams) == Alice
ます。左側は2つの文字列を減算しようとしています(未定義の定数は「ベアワード」と見なされ、名前の文字列化と同じです。John === 'John'
たとえば)。このような奇妙な操作を理解するために、PHPは両方の文字列を次のように変換します。数字。整数として、両方の文字列の値は0であるため、左側は0になります。
int。
ここで、PHPがと比較したい場合、PHPは==
両側を同じ型に強制変換したいと考えています。この場合、intに変換されます。 Alice
また、0に変換されます。両側が0であるため、「明らかに」等しくなります。
これを防ぐには、値を引用符で囲む必要があります。===
その型強制マジックが本当に必要でない限り、厳密な等号演算子()の使用を検討することもできます。
または、既知の演算子のセットがある場合は、eval
演算子のサブ関数を持つ比較関数を作成することで、これを排除し、より安全で堅牢にすることができます。そのようです:
function compare($value1, $op, $value2) {
static $known_ops = array(
'==' => function($a, $b) { return $a == $b; },
'!=' => function($a, $b) { return $a != $b; },
...
# you can even make up your own operators. For example, Perl's 'eq':
'eq' => function($a, $b) { return "$a" === "$b"; }
...
);
$func = $known_ops[$op];
return $func($value1, $value2);
}
...
$ruleTrue = compare($value, $operator, $value2);
今、あなたはあなたの価値観について心配する必要はありません。心配する必要はありますが$operator
、それは、検証せずにユーザーに入力させた場合にのみ問題になります。その場合、例外など$op
がない場合はスローする必要が$known_ops
あります。PHPに処理を任せた場合、を呼び出そうとすると致命的なエラーが発生する可能性がありますnull
。