Уровень звукового давления PHP:Охватывают ли его интерфейсы, связанные с массивами, все свойства массива?
Вопрос
Можно ли написать класс, практически неотличимый от реального массива PHP, реализовав все необходимые интерфейсы SPL?Упускают ли они что-нибудь критичное?
Мне хотелось бы создать более продвинутый объект Array, но я хочу быть уверенным, что не сломаю существующее приложение, которое повсюду использует массивы, если заменю их собственным классом Array.
Решение
Единственные проблемы, о которых я могу думать, это функции gettype() и is_array().Проверьте свой код на
gettype($FakeArray) == 'array'
is_array($FakeArray)
Потому что, хотя вы можете использовать объект как массив, он все равно будет идентифицирован как объект.
Другие советы
В дополнение к вышесказанному, вы не сможете заставить подсказки типов массивов в пользовательском пространстве работать с экземплярами вашего класса.Например:
<?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
Другие отличия включают оператор «+» для массивов (слияние) и отказ всего array_*
функции, включая часто используемые array_merge
и array_shift
.