4

在最近的 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

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

我是否对我的逻辑感到困惑,或者如果一个对象实现与数组相同的接口,它应该能够在所有相同的地方使用是否有意义?

4

2 回答 2

4

我是否对我的逻辑感到困惑,或者如果一个对象实现与数组相同的接口,它应该能够在所有相同的地方使用是否有意义?

Anarray是一种特殊的 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用参数做 -type 的东西$array并处理useArray可能产生的任何警告/错误。

于 2010-02-06T20:31:00.367 回答
0

您的类型提示说明其类型为“array”,但您传入了“ArrayObj”

function useArray(array $array)
...
useArray(new ArrayObj

所以是的,它会抱怨。

我是否对我的逻辑感到困惑,或者如果一个对象实现与数组相同的接口,它应该能够在所有相同的地方使用是否有意义?

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

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

于 2010-02-06T19:33:13.843 回答