Особенности условных конструкции со строками в PHP - статья на webew.ru
Незнание поведения данных операторов может приводить к ошибкам безопасности приложения. Что есть правда? Какие строки истинны? Имеем: "" is false "0" is false "-0" is true "0.0" is true "00" is true "A" is true Значит истинны все непустые строки, помимо строки "0". Логика такого поведения для меня не ясна. Второй оператор сравнивает совпадение типов и значений, основополагающий производит преобразование типа, а после этого выполняет соотнесение.
Черта оператора в том, что при сравнении числа и строки, просходит преобразование строки в цифра. Если строчка не представляет собой число, то она преобразуется в числовое значимость 0. Итог работы скрипта: "A" 0 is true "A" 0 is false "A" 0.0 is true "A" 0.0 is false Если ваша функция сравнивает строку, переданную в качестве аргумента с заданной строкой, то следует предварительно ревизовать, что в качестве аргумента передана строка, а не число.
Образец будет приведен дальше, при рассмотрении оператора switch. Оператор switch Мы ожидаем, что оператор switch сравнивает переданное важность с заданными константами. Специфика реализации switch в php в том, что он производит сопоставление с помощью оператора, то есть не производит сравнение типов. Mary's salary is ". Peter's salary is ". 0's salary is ".
Плод работы скрипта: John's salary is 3400 Mary's salary is 4600 Peter's salary is 0 0's salary is 3400 На примере видно, что секьюрити функции скомпрометирована путем передачи числового значения вместо строкового. Чтобы отстоять функцию от нежелательного использования, требуется обследовать тип входного значения. Результат работы скрипта: John's salary is 3400 Mary's salary is 4600 Peter's salary is 0 0's salary is 0 Следовательно, некоторые операции сравнения ведут себя контринтуитивно.
Кто предупрежден, тот вооружен. Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции. На самом деле тут всё логично..
Поясните будь другом логику. В Вашем примере употребляется trim - функция, удаляющая пробелы из начала и конца строки. На мой точка зрения такое поведение малоюзабельно. В PHP введено изъятие - строка "0", что кажется усложнением. Автоматическое приведение типа произойдет раньше сравнения, таков движок.
Для изменения поведения авторам PHP пришлось бы приложить дополнительные усилия, но значительно проще документировать это как особенное правило и позже гордиться. На мой воззрение корень проблемы таков. Все-таки любое приведение типов строку "00" также приведет к нулю, и все-таки эта строка есть true.
Верно говорят классики, что дизайн и реализация должны разделяться.
По материалам http://webew.ru/articles/528.webew