私はPHP用のデータバリデーターパッケージに取り組んでいます(主に、名前空間などの5.3での新しい追加のいくつかの演習として)。プラグインクラスを使用して実際の検証を行うメインのバリデータークラスを作成する予定です。
私が構築している最初の検証プラグインは、整数用の単純なプラグインです。ソースは以下のとおりです。
namespace validator\validatorplugins;
class Integer implements ValidatorPlugin
{
private
$field = NULL;
public function cast ()
{
return ($this -> field = (int) ($this -> field * 1));
}
public function isValid ()
{
if (!$isValid = is_int ($this -> field * 1))
{
$this -> field = NULL;
}
return ($isValid);
}
public function __construct ($field)
{
$this -> field = $field;
}
public function __toString()
{
return ((string) $this -> field);
}
}
上記のクラスの次のテストを使用しています。
$a = new Integer (0xDEADBEEF);
var_dump ($a -> isValid ());
var_dump ($a -> cast ());
echo ($a . "\n\n");
$b = new Integer ('0xDEADBEEF');
var_dump ($b -> isValid ());
var_dump ($b -> cast ());
echo ($b . "\n\n");
$c = new Integer (0777);
var_dump ($c -> isValid ());
var_dump ($c -> cast ());
echo ($c . "\n\n");
$d = new Integer ('0777');
var_dump ($d -> isValid ());
var_dump ($d -> cast ());
echo ($d . "\n\n");
上記のテストケースから、次の結果が得られます。
bool(true)int(3735928559)3735928559
bool(true)int(3735928559)3735928559
bool(true)int(511)511
bool(true)int(777)777
ご覧のとおり、8進数をエンコードする文字列で問題が発生しました。511(10進数で0777)と評価されるはずですが、実際には777になっています。
いつかこのクラスを使用してフォームを検証したいと思うかもしれません。また、フォームは常にPHPによって文字列の配列として扱われるため、このプラグインでたまたま文字列である8進数の処理に問題があることがわかります。
私は整数検証にさまざまなアプローチを試しました(is_intを使用すると文字列に対して常にfalseが返され、1を掛けると、is_numericはfloatをキャッチせず、型キャストとintvalは8進数を処理するときに望ましくない結果を生成します)。基数10(10進数)、基数16(16進数)、および基数8(8進数)で機能する他のアプローチはありますか?