#php #arrays
#php #массивы
Вопрос:
Я хочу создать единственную функцию для set_error_handler() для обработки неопределенных индексов в массиве с определенным именем. Например, массив называется: $products . Если у меня есть
$products = array(1 => 'a', 2 => 'b' // etc...
и позже выполнить вызов:
$a = $products[0];
Я получаю сообщение об ошибке. Я хочу обработать ошибку только для массива с именем $products и никаким другим.
Как я могу это сделать?
Пожалуйста, не давайте мне альтернативы этому методу решения проблемы. У меня уже была дискуссия по этому поводу, и было решено, что действительно лучше использовать этот метод. Я также должен предупредить, что это супер упрощение реальной вещи. Я уже пытался провести некоторые исследования, и ничего не помогло.
Комментарии:
1. Вместо обработчика ошибок, почему бы вам просто не использовать
ArrayAccess
интерфейс SPL ? Просто говорю, потому что обработчик ошибок не может сообщить вам, что речь идет о конкретной переменной. Может быть, вам следует поделиться большей частью своей проблемы, которую вы на самом деле скрываете?2. Неопределенные индексы по умолчанию являются уведомлениями, а не ошибками.
3. Никто не рассказывал мне об интерфейсе ArrayAccess. Я внимательно посмотрю на это, а затем сообщу. Ожидайте отчета завтра
4. Я проверил и протестировал это. Интерфейс ArrayAccess на самом деле является лучшим вариантом для этого конкретного случая. Интересно, почему никто не вспомнил об этом, когда я спросил, какой метод лучше всего подходит для такого рода вещей
Ответ №1:
Настройка обработчика ошибок достаточно проста — примеры здесь — но фильтрация на основе кода, который фактически вызвал ошибку, просто невозможна без очень запутанного сопоставления регулярных выражений (или чего-то подобного) со строкой сообщения об ошибке.
Вероятно, вам придется поискать какую-то другую форму решения, если вам действительно нужна эта функциональность. Вы могли бы использовать isset()
для предварительной проверки достоверности индекса или создать класс в стиле массива (например, с использованием ArrayAccess
или ArrayObject
из SPL) с некоторой встроенной логикой проверки индекса.
Я знаю, что вам не нужны разные решения, но мне было бы интересно узнать, почему / как вы решили, что предлагаемый вами метод действительно является лучшим способом?
Комментарии:
1. Я полагаю, это лучший способ. Это не совсем то, что я хотел, но, по крайней мере, он может выполнить эту работу. Теперь мне нужно проверить, как сделать это достаточно эффективным, чтобы вызывать его 500-700 раз в скрипте.