你如何强制执行PHP方法参数?

时间:2011-01-11 17:22:08

标签: php parameters methods

如何验证/管理您的PHP方法参数?为什么这样做?

2 个答案:

答案 0 :(得分:17)

好吧,假设您正在讨论类型检查方法参数,它取决于:

  1. 如果它期待一个对象,我使用带有接口的type-hinting

    public function foo(iBar $bar)
    
  2. 如果只期待一个数组,我会使用array关键字进行类型提示。

    public function foo(array $bar)
    
  3. 如果它需要一个字符串,int,bool或float,我会把它投射出来:

    public function foo($bar) {
        $bar = (int) $bar;
    }
    
  4. 如果期待混合,我只是检查一下:

    public function foo($bar) {
        if (is_string($bar)) {
            //handle string case
        } elseif (is_array($bar)) {
            //...
        } else {
            throw new InvalidArgumentException("invalid type");
        }
    }
    
  5. 最后,如果它期望迭代类型,我不使用类型提示。我首先检查它是否是一个数组,然后重新加载迭代器:

    public function foo($bar) {
        if (is_array($bar)) {
            $bar = new ArrayIterator($bar);
        }
        if (!$bar instanceof Traversable) {
            throw new InvalidArgumentException("Not an Iterator");
        }
    }
    
  6. 如果需要文件名或目录,请使用is_file进行确认:

    public function foo($bar) {
        if (!is_file($bar)) {
            throw new InvalidArgumentException("File doesn't exist");
        }
    }
    
  7. 我认为处理大多数情况。如果你想到其他人,我很乐意回答他们......

答案 1 :(得分:2)

Typechecking是你应该在开发阶段做的事情,而不是生产。所以适当的语法特征是:

 function xyz($a, $b) {
     assert(is_array($a));
     assert(is_scalar($b));

但是我会尽量避免它,或者优先使用类型强制。动态类型化的PHP可以很好地适应不同的值。只有少数几个地方你想要改变基本的语言行为。