PHP:如何强制方法的属性为整数?

时间:2012-12-07 01:29:29

标签: php type-hinting isnumeric

我目前的方式:

class A {
    public function function_b($myint) {
        if (!is_numeric($myint)) return false;

        // code ...
    }
}

我想放弃像这样的函数is_numeric():

public function function_b(Integer $myint) {
    // code ...
}

它适用于这样的数组:

public function function_c(Array $arr) {
    // only executes following code if $arr is an array / instance of Array!
}

注意:如果值不是数字(int),函数必须返回false!我不想投它。

你如何缩短我目前的代码?提前谢谢!

4 个答案:

答案 0 :(得分:3)

你不能在PHP中强制使用函数原型中的严格类型,因为它不是严格类型的语言。 PHP是一种弱类型的语言,在许多情况下,试图反对谷物只会伤害你。此外,is_numeric 保证您的值为int类型(,它的价值)。

您可以做的是分析您为什么首先认为这种方法是必要的,并决定如何最好地实现这一点而不会产生错误。

例如,采用以下方案,其中您的方法所期望的是数据库查询的ID。

class MyClass {
    public function getUser($id) {
        if (!is_int($id)) {
            throw new Exception("Invalid argument supplied. Expecting (int), but argument is of type (" . gettype($id) . ").");
        }
        // Otherwise continue
        $db = new PDO($dsn);
        $stmt = $db->prepare("SELECT username FROM users WHERE user_id = ?");
        $stmt->execute(array($id));
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }
}

$MyObject = new MyClass;
$result = $MyObject->getUser($_POST['id']);
/* The problem here is $_POST will always be of type string. */

这应该告诉你的是,在这里强制进行类型检查是没有意义的,因为只要你放弃它,PHP就会为你做正确的事情。

你需要问自己的问题不是“我如何强制严格打字?”,而是“为什么我需要强制严格打字?

答案 1 :(得分:2)

你应该研究一下类型转换:

在访问值时使用(int)将其强制转换为整数。

答案 2 :(得分:2)

你可以对它进行强制转换:

public function function_b($myint) {
    $myint = (int) $myint;
}

或者更好的是将公共设置器添加到class A,每次设置值时都会为您执行此操作:

class A
{
    public function setMyInt($myInt)
    {
        $this->myInt = (int) $myInt;
    }
}

- 更新(根据评论) -

class A
{
    public function doSomethingWithAnArray(array $array)
    {
        ....
    }
}

注意doSomethingWithAnArray方法签名中的关键字数组,现在如果你没有将数组传递给这个函数,PHP将抛出致命错误并停止执行代码。这称为 typehinting ,也可以应用于对象。

答案 3 :(得分:1)

function needsInteger($int) {
    if (((int) $int) != $int) return false;
    // ...
}

这里的优点是你仍然可以接受松散类型的参数,但是对于强制转换值的非严格等式检查将产生可接受的结果。