我有这个示例伪代码,$ x基本上是一个带有键和值的对象,或者是带有键和对象作为值的数组。 $ y将以两种不同的方式构建。
private function someFunction($x) {
if (is_object($x)) {
$y = 'result of something';
} elseif (is_array($x)) {
$y = 'result of something';
} else {
$y = null;
}
return $y;
}
这是一个很好的做法,如果功能不会在其他任何地方使用? '非hack'方式可能是将对象转换为数组(因为它本质上是一个数组),然后根据数组的数量创建逻辑。
或者我只是在考虑以正确的方式编写代码?
答案 0 :(得分:2)
在PHP中,这实际上是唯一可行的方法,至少对于类型检查我不会称之为不好的做法。在Java和其他语言中,我们有方法重载:
public String someFunction(Object $x) {
return "Result of something";
}
public String someFunction(Object[] $x) {
return "Result of something";
}
public String someFunction(int $y) {
return "Result of something";
}
在PHP中,我建议类似的关注点如此分开:
private function someFunction($x) {
if (is_object($x)) {
$y = $this->someFunctionObject($x);
} elseif (is_array($x)) {
$y = $this->someFunctionArray($x);
} else {
$y = $this->someFunctionScalar($x);
}
return $y;
}
private function someFunctionObject($x) {
}
private function someFunctionArray($x) {
}
private function someFuctionScalar($x) {
}
PHP等松散类型语言的问题在于实际上有类型,有时你需要处理它们。
我认为每次调用someFunction时都必须进行转换比在内部进行类型检查和转换更糟糕,因为重复的代码比一个方法中的if / else更有问题。
答案 1 :(得分:1)
只要输入由您控制并且您知道要对数据执行什么操作,就可以使用此功能。但是,对于来自外部的非受控来源的输入,您应事先验证数据,因为您不确定数据是否有效。
我不明白的是你如何达到一个点,变量可能是两种不同的类型:数组或对象。
如果你将它转换为数组然后处理它,或者使用你自己的函数,重要的是你的逻辑流程和代码完成它的目的。
如果上下文正确并且代码执行了预期的操作,那么您的代码就可以了。