array_values不适用于ArrayAccess对象

时间:2012-03-13 23:03:08

标签: php arrayaccess

array_values()不适用于ArrayAccess对象。 array_keys()

也没有

为什么?

如果我可以访问$object['key']我应该能够进行所有类型的数组操作

3 个答案:

答案 0 :(得分:4)

不,你误解了ArrayAccess的实用程序。它不仅仅是一种数组包装器。是的,实现它的标准示例使用私有$array变量,其功能由类包装,但这不是特别有用的变量。通常,您也可以使用数组。

ArrayAccess的一个很好的例子是当脚本不知道哪些变量可用时。

作为一个相当愚蠢的例子,想象一个与远程服务器一起工作的对象。可以使用网络上的API读取,更新和删除该服务器上的资源。程序员决定使用类似数组的语法来包装该功能,因此$foo['bar'] = 'foobar'将该服务器上的bar资源设置为foobarecho $foo['bar']检索它。如果不尝试所有可能的值,脚本无法找出存在的键或值。

因此,ArrayAccess允许使用数组语法来设置,更新,检索或删除具有类似数组语法的对象:不多也不少。

另一个界面Countable允许使用count()。您可以在同一个类上使用这两个接口。理想情况下,会有更多此类接口,可能包括可以array_valuesarray_keys的接口,但目前它们不存在。

答案 1 :(得分:2)

ArrayAccess非常有限。它不允许使用本机array_函数(没有现有接口)。

如果您需要对对象执行更多类似数组的操作,那么您实际上是在创建一个集合。应该通过其方法来操纵集合。

因此,创建一个对象并扩展ArrayObject。这会实现IteratorAggregateTraversableArrayAccessSerializableCountable

如果您需要密钥,只需添加array_keys方法:

public function array_keys($search_value = null, $strict = false)
{
    return call_user_func_array('array_keys', array($this->getArrayCopy(), $search_value, $strict));
}

然后你可以:

foreach ($object->array_keys() as $key) {
    echo $object[$key];
}

答案 2 :(得分:0)

ArrayObject / ArrayAccess允许对象作为数组工作,但它们仍然是对象。因此,不应使用array_keys()(仅适用于数组),而应使用get_object_vars(),例如:

var_dump(array_keys(get_object_vars($ArrObj)));

或通过(array) $ArrObj将其转换为数组来转换您的ArrayObject,例如:

var_dump(array_keys((array)$ArrObj));