题
在最近更新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
是一个成熟的对象实现众多接口(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
可能产生。
其他提示
您类型提示被陈述在“ArrayObj”
的类型的“阵列”,但你的传球function useArray(array $array)
...
useArray(new ArrayObj
所以是它去抱怨。
我是在我的逻辑混淆,或者它 是有道理的,如果一个对象 实现相同的接口作为 阵列,它应该能够在被使用 所有相同的地方?
如果该对象实现了相同的接口,另一个类,是的,你可以互换使用它们,但它仍然有效的编译器抱怨你的类型提示,因为它的类型不一样的。
仅仅因为两个对象实现相同的接口并不意味着它们是相同类型的。