array_values ​​не работает с объектом ArrayAccess - PullRequest
4 голосов
/ 14 марта 2012

array_values() не работает с объектом ArrayAccess.array_keys()

почему?

, если я могу получить доступ к $object['key'], я должен иметь возможность выполнять все виды операций с массивами

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

Нет, вы неправильно поняли утилиту ArrayAccess.Это не просто оболочка для массива.Да, в стандартном примере для его реализации используется закрытая переменная $array, функциональность которой заключена в класс, но это не особенно полезно.Часто вы также можете просто использовать массив.

Один хороший пример ArrayAccess - это когда скрипт не знает, какие переменные доступны.

В качестве довольно глупого примера представьте объектэто работало с удаленным сервером.Ресурсы на этом сервере можно читать, обновлять и удалять с помощью API по всей сети.Программист решает, что он хочет обернуть эту функциональность синтаксисом, подобным массиву, поэтому $foo['bar'] = 'foobar' устанавливает для ресурса bar на этом сервере значение foobar, а echo $foo['bar'] получает его.Сценарий не может определить, какие ключи или значения присутствуют, не испробовав все возможные значения.

Таким образом, ArrayAccess позволяет использовать синтаксис массива для установки, обновления, извлечения или удаления из объекта с синтаксисом, подобным массиву.: Не больше, не меньше.

Другой интерфейс, Countable, позволяет использовать count().Вы можете использовать оба интерфейса в одном классе.В идеале, было бы больше таких интерфейсов, возможно, включая те, которые могут выполнять array_values или array_keys, но в настоящее время их не существует.

2 голосов
/ 14 марта 2012

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];
}
0 голосов
/ 10 декабря 2015

ArrayObject / ArrayAccess позволяет объектам работать как массивы, но они по-прежнему являются объектами.Поэтому вместо array_keys() (которые работают только с массивами) вы должны использовать get_object_vars(), например:

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

или преобразовать ваш ArrayObject путем приведенияв массив по (array) $ArrObj, например:

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