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可能生成的任何警告/错误.