|
о проявляется как раз в
инструкции if. Вот примеры (листинг 12.1):
Листинг 12.1. Внимание! Опасное место!
$one=1 // число один
$zero=0 // присваиваем число ноль
if($one=="") echo 1 // очевидно, не равно — не выводит 1
if($zero=="") echo 3 // Внимание! Вопреки ожиданиям печатает 3!
if(""==$zero) echo 4 // И это тоже не поможет!..
if("$zero"=="") echo 5 // Не работает в некоторых версиях PHP 3
if(strval($zero)=="") echo 6; // Вот теперь правильно — не выводит 6
Часть IV. Стандартные функции PHP 208
if($zero==="") echo 7 // Самый лучший способ, но не действует в PHP 3
Получается, что в операциях сравнения пустая строка "" прежде всего трактуется
как
0 (ноль) и уж затем — как "пусто"? Это звучит довольно парадоксально, но это
дей-
ствительно так. Операнды сравниваются как строки только в том случае, если они
оба — строки, в противном случае идет числовое сравнение. При этом пустая
строка
воспринимается как 0, впрочем, как и любая другая, которую интерпретатору не
уда-
лось перевести в число.
В первых версиях PHP 3 при присоединении к числовому нулю пустой строки
этот ноль не менял типа, не становился строкой "0". Видимо, срабатывала ка-
кая-то оптимизация, и PHP просто пропускал этот бессмысленный, на его
взгляд, шаг. Проведенные мной тесты показывают, что в PHP версии 3.0.12 и
старше эта ошибка исправлена, но все же иногда нужно иметь ее в виду, осо-
бенно, если сценарии должны быть хорошо переносимыми.
Итак, если вы хотите сравнить две переменные-строки, нужно быть абсолютно уве-
ренными, что их типы именно строковые, а не числовые.
Впрочем, это не распространяется на новый оператор PHP версии 4 === (тройное
ра-
венство, или оператор эквивалентности). Его использование заставляет
интерпрета-
тор всегда сравнивать величины и по значению, и по их типу. Итак, с точки
зрения
PHP 0=="", но 0!==="". Если вы не собираетесь программировать на PHP версии,
ниже третьей, рекомендую всегда использовать === вместо strval(), как это было
сделано в листинге 12.1.
Существует одна стандартная ошибка, которую делают многие. Вот в чем она состо-
ит. Есть такая функция — strpos($str,$what), которая возвращает позицию под-
строки $what в строке $str или false, если подстрока не найдена. Пусть нам
нужно
проверить, встречается ли в некоторой строке $str подстрока (и напечатать
"это
PHP-программа", если встречается). Как мы знаем, вариант
if(strpos($str,"")!=false)
echo "это PHP-программа";
не годится, если находится в самом начале строки (в этом случае не будет
выдано
наше сообщение, хотя подстрока в действительности найдена, и функция возвратила
0, а не false).
Если вы еще собираетесь работать с PHP версии 3, указанную проблему можно ре-
шить так:
if(strval(strpos($str,""))!="")
echo "это PHP-программа";
Конечно, выглядит это немного "накручено", зато действительно работает. Приятно
отметить, что в PHP версии 4 проблема решается гораздо более изящным образом:
if(strpos($str,"")!===false)
echo "это PHP-программа";
Глава 12. Строковые функции 209
Рекомендую всегда применять последний способ.
Обратите внимание, что мы используем оператор !=== именно с константой
false, а не с пустой строкой "". Дело в том, что для этого оператора
false!==="", в то время как, разумеется, false=="".
Функции для работы
с одиночными символами
string chr(int $code)
Возвращает строку из одного символа с кодом $code. Эта функция полезна для
вставки каких-либо непечатаемых символов в строку — например, кода нуля или
символа прогона страницы, а также при работе с бинарными файлами. Пример из
листинга 12.2 позволяет вам просмотреть, какие коды соответствуют всем символам,
которые можно отобразить в браузере. Иногда эта программ
|
|