如何验证/管理您的PHP方法参数?为什么这样做?
答案 0 :(得分:17)
好吧,假设您正在讨论类型检查方法参数,它取决于:
如果它期待一个对象,我使用带有接口的type-hinting:
public function foo(iBar $bar)
如果只期待一个数组,我会使用array
关键字进行类型提示。
public function foo(array $bar)
如果它需要一个字符串,int,bool或float,我会把它投射出来:
public function foo($bar) {
$bar = (int) $bar;
}
如果期待混合,我只是检查一下:
public function foo($bar) {
if (is_string($bar)) {
//handle string case
} elseif (is_array($bar)) {
//...
} else {
throw new InvalidArgumentException("invalid type");
}
}
最后,如果它期望迭代类型,我不使用类型提示。我首先检查它是否是一个数组,然后重新加载迭代器:
public function foo($bar) {
if (is_array($bar)) {
$bar = new ArrayIterator($bar);
}
if (!$bar instanceof Traversable) {
throw new InvalidArgumentException("Not an Iterator");
}
}
如果需要文件名或目录,请使用is_file
进行确认:
public function foo($bar) {
if (!is_file($bar)) {
throw new InvalidArgumentException("File doesn't exist");
}
}
我认为处理大多数情况。如果你想到其他人,我很乐意回答他们......
答案 1 :(得分:2)
Typechecking是你应该在开发阶段做的事情,而不是生产。所以适当的语法特征是:
function xyz($a, $b) {
assert(is_array($a));
assert(is_scalar($b));
但是我会尽量避免它,或者优先使用类型强制。动态类型化的PHP可以很好地适应不同的值。只有少数几个地方你想要改变基本的语言行为。