Использование утверждений для проверки типов в php?

Я делаю некоторые проверки аргументов в моих классах в php, используя функции исключения. У меня есть функции, которые делают базовую проверку (===, in_array и т.д.) и бросить исключение на ложь. Так что я могу сделать assertNumeric($argument, "\$argument is not numeric."); вместо

if ( ! is_numeric($argument) ) {
    throw new Exception("\$argument is not numeric.");
}

Сохраняет некоторые набрав

В комментариях на странице руководства php по assert() я читал, что

Как отмечается в Википедии - "утверждения в первую очередь являются инструментом разработки, они часто отключаются, когда программа публикуется для общественности". и "Утверждения должны использоваться для документирования логически невозможных ситуаций и обнаружения ошибок программирования - если происходит" невозможное ", то что-то фундаментальное явно неправильно". Это отличается от обработки ошибок: большинство состояний ошибок возможно, хотя некоторые могут быть крайне маловероятными. На практике использование утверждений в качестве механизма обработки ошибок общего назначения, как правило, неразумно: утверждения не допускают постепенного восстановления после ошибок, а ошибка подтверждения часто резко останавливает выполнение программы. Утверждения также не отображают дружественную пользователю ошибку сообщение."

Это означает, что совет, данный "gk at proliberty dot com" о принудительном включении утверждений, даже если они были отключены вручную, противоречит рекомендациям по их использованию только в качестве инструмента разработки.

Итак, я делаю это неправильно? Какие другие / лучшие способы сделать это есть?

2 ответа

Лично я бы второй контент Википедии и не использовал утверждения для регулярной проверки типов.

Вместо этого я бы использовал PHP Type-Hinting (в настоящее время работающий с объектами как php 5.1 и массивами с php 5.2 ... не поможет вам с базовыми типами данных, но это все же лучше, чем ничего); затем вы можете использовать функции, на которые вы намекаете, или даже пойти немного дальше и рассмотреть патч Ильи Альшанецкого для общего хинтинга. Смотрите здесь.

Как и в случае с обычными утверждениями, вы должны иметь возможность отключить свои пользовательские утверждения с помощью удобного метода глобальной константы или переменной или конструктора класса. Они действительно не принадлежат (активны) в рабочем коде или активны по умолчанию в любой библиотеке. То, для чего вы их используете, кажется пустой тратой циклов ЦП, даже если вы можете их отключить.

В языках более низкого уровня утверждения очень полезны для выявления очень странных ситуаций, таких как ошибки, возникающие из-за чрезмерно рьяной архитектуры специфических оптимизаций компилятора. Например, вы знаете, что в любой разумной вселенной утвержденное условие будет верным. Затем ваш компилятор разрывает структуру пространства-времени, и все меняется. Так что, возможно, они будут полезны, если вы используете что-то вроде PHC или Roadsend для компиляции своего приложения.

Я также видел "чрезмерно безопасный" код (в основном на C), где вход в каждую функцию защищен утверждениями. Я действительно подвергаю сомнению мудрость этого.

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

Другие вопросы по тегам