Am I confused in my logic, or does it
makes sense that if an object
implements the same interface as an
array, it should be able to be used in
all the same places?
数组是一种特殊的PHP变量类型 – 不是对象 – 因此它不实现任何接口. ArrayObject是一个成熟的对象,它实现了许多接口(Countable,ArrayAccess等),并使某个对象在某些情况下就像一个数组(就像在foreach循环中一样).因此,虽然它们没有实现相同的接口,但它们有时表现相同.
理想的解决方案是PHP支持多个功能签名:
function useArray(array $array) { }
function useArray(ArrayObject $array) { }
但是直到我们得到它(如果我们得到它),你只需要检查函数定义之外的变量类型:
function useArray($array) {
if (is_array($array) || $array instanceof ArrayObject) {
// Do some stuff
} else {
throw new Exception('I require an array or an array-like structure!');
}
}
或者尝试使用$array参数执行数组类型的东西,并处理useArray可能生成的任何警告/错误.
这篇博客讨论了在PHP中,一个对象如果实现了与数组相同的接口,是否应该能在所有使用数组的地方被互换使用的问题。尽管数组不是对象且不实现接口,ArrayObject实现了诸如Countable和ArrayAccess等接口,允许它在某些情况下行为类似数组。由于PHP不支持多函数签名,作者建议通过检查变量类型或尝试使用变量作为数组来确保正确性,并处理可能出现的异常。
269

被折叠的 条评论
为什么被折叠?



