将对象用作数组

时间:2010-02-06 19:28:00

标签: php spl

在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

逻辑上,该对象应该可以在任何可以使用数组的地方使用,因为它实现了与数组相同的接口。

我的逻辑是否感到困惑,或者如果一个对象实现与数组相同的接口,它应该可以在所有相同的位置使用吗?

2 个答案:

答案 0 :(得分:4)

  

我对自己的逻辑感到困惑,还是这样   有意义的是,如果一个对象   实现与a相同的接口   数组,它应该可以用于   所有相同的地方?

array是一种特殊的PHP变量类型 - 不是一个对象 - 因此它不实现任何接口。 ArrayObject是一个成熟的对象,它实现了许多接口(CountableArrayAccess等),并使某个对象在某些情况下就像一个数组(就像在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相同的接口   数组,它应该可以用于   所有相同的地方?

如果对象实现了与另一个类相同的接口,是的,你可以互换使用它们,但它仍然适用于编译器抱怨你的类型提示,因为它不是同一类型。

仅仅因为两个对象实现相同的接口并不意味着它们属于同一类型。