我正在为 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");
从上述测试用例中,我得到以下结果:
布尔(真)整数(3735928559)3735928559
布尔(真)整数(3735928559)3735928559
布尔(真)整数(511)511
布尔(真)整数(777)777
如您所见,我遇到了一个编码八进制数的字符串的问题。它应该评估为 511(以 10 为底的 0777),但实际上我得到的是 777。
因为我可能有一天想使用这个类来验证表单,并且由于 PHP 总是将表单视为字符串数组,所以您可以看到使用这个插件处理恰好是字符串的八进制数是有问题的。
我尝试了各种整数验证方法(使用 is_int 总是为字符串返回 false,乘以 1 并且 is_numeric 不会捕获浮点数,类型转换和 intval 在处理八进制数时会产生不需要的结果)。是否有其他方法可以用于基数 10(十进制)、基数 16(十六进制)和基数 8(八进制)?