использование утверждений для проверки типов в php? - PullRequest
4 голосов
/ 11 мая 2010

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

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

Экономит время при наборе

Я читал в комментариях к странице справочника php по assert () that

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

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

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

Ответы [ 2 ]

1 голос
/ 12 мая 2010

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

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

0 голосов
/ 12 мая 2010

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

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

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

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

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