在最近更新PHP,它们在各种接口添加到允许一个对象被视为一个阵列,诸如了ArrayAccess,迭代器,可列等

我的问题是,它会接着意义的是,下面应该工作:

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

逻辑上,对象应该能够在任何地方使用的阵列可以被使用,因为它实现了相同的接口的阵列。

我是混淆在我的逻辑,或者它是有道理的,如果一个对象实现相同的接口的阵列,它应该能够在所有相同的地方使用?

有帮助吗?

解决方案

  

我是在我的逻辑混淆,或者它   是有道理的,如果一个对象   实现相同的接口作为   阵列,它应该能够在被使用   所有相同的地方?

这是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可能产生。

其他提示

您类型提示被陈述在“ArrayObj”

的类型的“阵列”,但你的传球
function useArray(array $array)
...
useArray(new ArrayObj

所以是它去抱怨。

  

我是在我的逻辑混淆,或者它   是有道理的,如果一个对象   实现相同的接口作为   阵列,它应该能够在被使用   所有相同的地方?

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top