Почему array_map выдает предупреждение, когда замыкание вызывает исключение? - PullRequest
9 голосов
/ 02 апреля 2011

Недавно я снова начал программировать на PHP, после долгой работы с другими языками, во время которой я разработал более функциональный стиль - который я надеюсь попробовать и сохранить.

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

$func = function($item) {
    if ($item == 0)
        throw new Exception("Can't do 0");
    return $item;
};

try {
    array_map($func, array(1, 2, 3, 0, 5));
} catch (Exception $ex) {
    echo "Couldn't map array";
}

При выполнении кода выше, я вижу следующий вывод:

Предупреждение: array_map (): произошла ошибка при вызове обратного вызова карты в map_closure.php в строке 10 Не удалось отобразить массив

Я могу устранить ошибку с помощью @ на array_map, но в лучшем случае это выглядит хакерским.

Ответы [ 4 ]

7 голосов
/ 02 апреля 2011

Предупреждение генерируется, потому что, проще говоря, функция обратного вызова не возвращается нормально (из-за выброса исключения).Это просто способ кодирования array_map(), если функция обратного вызова не завершает свое выполнение.Помните, что исключение немедленно прекращается из-за вашего PHP-кода.

Что касается того, как заставить замолчать предупреждение, это полностью ваше дело.К сожалению, предупреждение будет сгенерировано, и вы решите похоронить его или позволить отображать его.

В качестве отступления, возможно, ваш тестовый пример был слишком упрощен, но это сильнобольше смысла использовать array_filter() (или, возможно, array_reduce()) там.

2 голосов
/ 02 апреля 2011

Как говорит preinhaimer, array_map очень затрудняет вам точное представление о том, что произошло во время его выполнения, потому что оно предшествует исключениям.Было бы нецелесообразно больше менять его поведение, поскольку это привело бы к взлому множества (плохо закодированных) приложений;это жизнь.

Если вы хотите механизм, с помощью которого можно проверить, завершен ли array_map без ошибок или нет, я отправил подробный ответ (с кодом) на этот вопрос , в котором рассматриваютсяпрактически с той же проблемой.Это не так просто, как try/catch, но вы работаете с тем, что имеете.

1 голос
/ 19 сентября 2012

Либо используйте @, либо foreach вместо array_map

0 голосов
/ 02 апреля 2011

array_map () предшествует исключениям, поэтому все еще использует предупреждения. В PHP есть несколько раздражающих мест, где вы все еще вынуждены использовать обработку ошибок, это одно из них.

У вас остаются такие параметры, как возвращение нулевого или другого неиспользуемого значения при обнаружении проблемы или фильтрация массива, чтобы убедиться, что он содержит только допустимые параметры, прежде чем запускать его через array_map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...