1

我目前的方式:

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

4 回答 4

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 会为你做正确的事情。

您需要问自己的问题不是“我如何强制严格输入? ”,而是“我为什么需要强制严格输入? ”。

于 2012-12-07T01:44:25.953 回答
2

您应该研究类型转换:

只需在访问值时使用 (int) 将其类型转换为整数。

于 2012-12-07T01:32:03.320 回答
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 将抛出一个致命错误并停止代码执行。这称为类型提示,也可以应用于对象。

于 2012-12-07T01:33:12.983 回答
1
function needsInteger($int) {
    if (((int) $int) != $int) return false;
    // ...
}

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

于 2012-12-07T02:12:16.513 回答