1

我正在为 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(八进制)?

4

2 回答 2

3

intval has an optional argument $base:

intval('0777', 8); // 511
intval('0777', 10); // 777
intval('0777'); // 777
intval(0777); // 511

So you could do something like this:

$i = '0777';

$base = 10;
if (strtolower(substr($i, 0, 2)) === '0x') $base = 16;
else if (substr($i, 0, 1) === '0') $base = 8;

intval($i, $base);
于 2011-08-06T14:02:41.430 回答
0

您首先需要定义八进制数在字符串中的表示方式。因为有些人倾向于说像这样的字符串是"0777" 十进制777值。

那么你的班级应该如何知道用户在进行你想要验证的输入时的想法(或者更正确地转换为整数值)。

就您而言,要模拟 PHP 本身如何将值解析为“作为 PHP”,您可以使用 eval ( Demo ) 进行模拟:

<?php

$value = '0777';

$value = eval("return $value;");

var_dump($value);

然而,这并不能解决潜在的设计问题。你的沙盒类应该有一个DecimalInteger或一个或一个HexadecimalIntegerOctalInteger

于 2011-08-06T14:20:50.227 回答