Ответ 1
Хорошо, так как вы использовали слово "pretty" в своем посте, просто быстрое предложение о косметических изменениях для удобочитаемости:
function is_array_or_alike($var) {
return is_array($var) ||
($var instanceof ArrayAccess &&
$var instanceof Traversable &&
$var instanceof Serializable &&
$var instanceof Countable);
}
Объяснение изменений:
-
Изменение имени функции: "
is_array_alike
" → "is_array_or_alike
", чтобы было ясно, что тестируются как массивы, так и аналогичные. -
Изменение имени параметра/аргумента:
$array
→$var
, потому что "$array
" уже является предпосылкой того, что аргумент имеет массив типов. -
Установки и 'ed условия для удобочитаемости и соответствия стандарту кодирования Drupal: 80- char line max. Поскольку вы являетесь одним из разработчиков ядра Drupal, я предполагаю, что я предполагаю, что эта функция, возможно, войдет в Drupal, так что, возможно, вы сделали бы это до того, как все это закончите.
-
Вы правы, что
is_object()
не требуется. В Java это было бы необходимо, потому чтоinstanceof
выдавал ошибку времени компиляции, если первый операнд не был объектом, но я только что проверил в PHP и нет ошибки, просто результат bool (false).
I второе предложение paulmatthews86 о том, что вы предоставляете прецедент. Трудно дать рекомендации, если мы не знаем критериев. Например, чтобы одолжить немного с точки зрения парадигмы утки, тесты instanceof
были бы полезны, но не обязательно обязательно или даже полностью. Если вас больше интересует то, что может сделать $var
и то, как он ведет себя в определенных контекстах, тогда вы можете использовать отражение, чтобы проверить наличие методов, которые нужно вызвать на нем позже, или вы можете проверить, что он ведет себя как ожидается при передаче функций массива. например Работает ли он с array_udiff_assoc
, array_chunk
и т.д. Если эти поведения более важны для ваших случаев использования, тогда эти тесты могут заменить типовое тестирование instanceof
, хотя, конечно, будет много перекрытий.
Надеюсь, это поможет. Заинтересованы в том, чтобы узнать, что вы, наконец, решите, если вы решите опубликовать его.