在PHP的最新更新中,他们在各种接口中添加了允许将对象视为数组,例如ArrayAccess,Iterator,Countable等。
我的问题是,以下内容应该有效吗
function useArray(array $array)
{
print_r($array);
}
useArray(new ArrayObj(array(1,2,3,4,5));
截至目前,PHP抛出了类型提示错误,因为$array
在技术上并不是一个数组。但是,它实现了所有接口,使其基本上与数组相同。
echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2
逻辑上,该对象应该可以在任何可以使用数组的地方使用,因为它实现了与数组相同的接口。
我的逻辑是否感到困惑,或者如果一个对象实现与数组相同的接口,它应该可以在所有相同的位置使用吗?
答案 0 :(得分:4)
我对自己的逻辑感到困惑,还是这样 有意义的是,如果一个对象 实现与a相同的接口 数组,它应该可以用于 所有相同的地方?
array
是一种特殊的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
- 使用$array
参数键入内容并处理useArray
可能生成的任何警告/错误。
答案 1 :(得分:0)
你的类型提示声明它的类型为“array”但是你传入的是“ArrayObj”
function useArray(array $array)
...
useArray(new ArrayObj
所以是的,它会抱怨。
我对自己的逻辑感到困惑,还是这样 有意义的是,如果一个对象 实现与a相同的接口 数组,它应该可以用于 所有相同的地方?
如果对象实现了与另一个类相同的接口,是的,你可以互换使用它们,但它仍然适用于编译器抱怨你的类型提示,因为它不是同一类型。
仅仅因为两个对象实现相同的接口并不意味着它们属于同一类型。