PHP SPL: покрывают ли его интерфейсы с массивами все свойства массива? - PullRequest
6 голосов
/ 28 сентября 2008

Можно ли написать класс, который будет практически неотличим от реального массива PHP, реализуя все необходимые интерфейсы SPL? Они что-то упускают, что было бы критично?

Я бы хотел построить более продвинутый объект Array, но я хочу убедиться, что я не сломаю существующее приложение, которое использует массивы везде, если я заменил их собственным классом Array.

Ответы [ 3 ]

7 голосов
/ 28 сентября 2008

Единственные проблемы, о которых я могу думать, это функции gettype () и is_array (). Проверьте свой код для

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

Потому что, хотя вы можете использовать объект как массив, он все равно будет идентифицирован как объект.

4 голосов
/ 29 сентября 2008

В дополнение к указанным выше пунктам вы не сможете заставить подсказки типа массива пользовательского пространства работать с экземплярами вашего класса. Например:

<?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 
3 голосов
/ 28 сентября 2008

Другие различия включают оператор '+' для массивов (объединение) и сбой всех функций array_*, включая обычно используемые array_merge и array_shift.

...