Я пишу служебную функцию для обработки массивов. Во избежание сложности предположим, что это простой дескриптор, позволяющий вставлять сокращенные массивы в функцию:
function array_insert($original_arr,$key,$val){
$original_arr[$key]=$val;
return $original_arr;
}
С использованием варианта использования, например
validate_input(array_insert($_GET,'extra-key','val'));
Теперь скажем, у нас может быть проблема, которая $_GET
может не быть массивом. Или, скажем, мы принимаем данные от внешнего звонка; где лежит ответственность за проверку того, что первый параметр является массивом?
Если это сформировало начало сложного стека обработки, мы могли бы сделать:
if (is_array($our_data)){
do_something($our_data);
do_something_else(array_insert($our_data,'key','val'));
}
Это не дает возможности сообщить области вызова, что do_something
не случилось, хотя Итак, мы могли бы сделать:
if (!is_array($our_data)){
throw new Exception('not an array');
}
Теперь все, что использует наш метод, должно быть подготовлено, чтобы поймать это, и в зависимости от того, действительно ли мы заботимся о результате, нам может понадобиться поймать его в нашем методе.
Мы могли бы просто выйти из функции полезности и вернуть false, что-то еще может проверить:
function array_insert($original_arr,$key,$val){
if (!is_array($our_data)){
return []; // which is empty but expected, or return false.. or null...
}
}
Тогда есть самый низкий уровень:
function array_insert(Array $original_arr)
Что вызовет исключение уровня PHP, если массив не передан.
Так что вопрос в том; для функции полезности, какую ответственность мы берем на себя в случае использования? Вызываем ли мы исключение языка с помощью TypeHint, мы молча терпим неудачу, не пытаемся ли мы проверить и позволить конечному пользователю это выяснить?
Во-первых, люди отмечают, что это субъективно — я согласен, хотя, вероятно, будет признанная лучшая практика, например, один рекомендован схемами сертификации или крупными компаниями в мире PHP.
Во-вторых, еще один вопрос (вызванный первым ответом) заключается в том, существует ли установленный класс исключения / имя класса для такого рода проблемы?
Как уже упоминалось в комментариях, это абсолютно субъективно, но лично:
я всегда используйте подсказки типа для объектов и массивов.
Для функций, работающих на примитивных типах, я бросаю InvalidArgumentException
основанный на значении, только если некоторые значения недопустимы, и это может быть неочевидно.
Например, функция, вычисляющая квадратный корень числа, может выдать исключение при передаче отрицательного значения.
Во всех других случаях я использую осмысленные имена функций / параметров и предполагаю, что если кто-то решит, что это хорошая идея — передать нечисловую строку или массив в функцию, определенную как
doStuffWithNumbers($num1, $num2)
Это его ответственность, если в результате случится что-то плохое.
Других решений пока нет …