PHP的SPL:涉及数组的接口是否覆盖所有数组属性?

时间:2020-03-06 14:50:28  来源:igfitidea点击:

通过实现所有必要的SPL接口,可以编写与实际的PHP数组几乎没有区别的类吗?他们是否遗漏了一些至关重要的东西?

我想构建一个更高级的Array对象,但是我想确保如果我用自定义Array类代替它们,那么不会破坏在各处使用数组的现有应用程序。

解决方案

我能想到的唯一问题是gettype()和is_array()函数。
检查代码是否

gettype($FakeArray) == 'array' 
is_array($FakeArray)

因为尽管我们可以像使用数组一样使用对象,但仍将其标识为对象。

其他区别包括数组的" +"运算符(合并)和整个array_ *函数的故障,包括常用的array_merge和array_shift。

除了上述要点外,我们将无法使用户空间数组类型提示与类的实例一起使用。例如:

<?php
function f(array $a) { /*...*/ }

$ao = new ArrayObject();
f($ao); //error
?>

输出:

Catchable fatal error: Argument 1 passed to f() must be an array, object given