array_values()
不适用于ArrayAccess对象。
array_keys()
为什么?
如果我可以访问$object['key']
我应该能够进行所有类型的数组操作
答案 0 :(得分:4)
不,你误解了ArrayAccess的实用程序。它不仅仅是一种数组包装器。是的,实现它的标准示例使用私有$array
变量,其功能由类包装,但这不是特别有用的变量。通常,您也可以使用数组。
ArrayAccess的一个很好的例子是当脚本不知道哪些变量可用时。
作为一个相当愚蠢的例子,想象一个与远程服务器一起工作的对象。可以使用网络上的API读取,更新和删除该服务器上的资源。程序员决定使用类似数组的语法来包装该功能,因此$foo['bar'] = 'foobar'
将该服务器上的bar
资源设置为foobar
,echo $foo['bar']
检索它。如果不尝试所有可能的值,脚本无法找出存在的键或值。
因此,ArrayAccess允许使用数组语法来设置,更新,检索或删除具有类似数组语法的对象:不多也不少。
另一个界面Countable
允许使用count()
。您可以在同一个类上使用这两个接口。理想情况下,会有更多此类接口,可能包括可以array_values
或array_keys
的接口,但目前它们不存在。
答案 1 :(得分:2)
ArrayAccess
非常有限。它不允许使用本机array_
函数(没有现有接口)。
如果您需要对对象执行更多类似数组的操作,那么您实际上是在创建一个集合。应该通过其方法来操纵集合。
因此,创建一个对象并扩展ArrayObject。这会实现IteratorAggregate
,Traversable
,ArrayAccess
,Serializable
和Countable
。
如果您需要密钥,只需添加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));