Вы находитесь на странице: 1из 4

Лекции курса PHP7 + MySQL с нуля

(краткое содержание)

ЛЕКЦИЯ 28. СТАНДАРТНЫЕ ФУНКЦИИ. СТРОКИ. ЧАСТЬ 1.

Серия уроков о стандартных функциях в PHP начнется с одних из самых


востребованных – функций для работы со строковыми переменными.
В PHP существует возможность использовать в строках любые символы с
допустимыми кодировками – в UTF-8 это символы с кодами от 0 до 255.
Есть нюанс в представлении строк в PHP – в них нет символа окончания
строки, что означает хранение этого значения в отдельной ячейке.
Стоит отдельно упомянуть о кодировках системы. В PHP до сих пор не принято
общих правил применения кодировок. Это означает, что часть функций работает в
представлении UTF-8, а другая – в старых форматах. При этом для разработчиков
существует несколько вариантов решения проблемы интерпретации строк в
формате UTF-8, который на данный момент является общепринятым стандартом
для работы в интернете:
- изменение работы расширения mbstring в настройках файла php.ini;
- использование ряда функций с префиксом mb_, например, вместо strlen() –
mb_strlen().
Также, если Вы работаете с использованием IDE, то почти всегда существует
возможность настроить использование кодировки через настройки
непосредственно среды разработки.
Какой из способов использовать – дело выбора каждого, но стоит отметить,
что изменение параметров работы расширения может привести к некоторым
конфликтам со сторонними приложениями, например, phpMyAdmin – удобным
интерфейсом для работы с базами MySQL.

Длина строки
Яркий пример использования префикса mb_ - использование функции strlen().
Эта функция позволяет узнать длину строки в количестве символов.
Листинг 28.1. Пример использования функций strlen() и mb_strlen()

$str_var_en = "New string with '<' and '$' symbols";


$str_var_ru = "Новая строка с '<' и '$' символами";

//Применение функции strlen()


echo "<p>Применение функции strlen() для строки, содержащей только английские и
специальные символы: ".strlen($str_var_en)."</p>";
echo "<p>Применение функции strlen() для строки, содержащей только русские и
специальные символы: ".strlen($str_var_ru)."</p>";

//Применение функции mb_strlen()


echo "<p>Применение функции mb_strlen() для строки, содержащей только
английские и специальные символы: ".mb_strlen($str_var_en)."</p>";
echo "<p>Применение функции mb_strlen() для строки, содержащей только русские и
специальные символы: ".mb_strlen($str_var_ru)."</p>";

Как видно из результатов в браузере, при использовании только английских и


специальных символов, в строках одинаковое количество байт, что при
использовании strlen(), что при использовании mb_strlen().

1
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Но при использовании русских символов количество символов при


использовании функции strlen() больше. Связано это с тем, что эта функция
привела длину строки не в количестве символов, а в количестве байт – под русские
символы отводится по 2 байта. При этом, функция mb_strlen() подсчитала
количество символов с учетом использования русского алфавита.

Конкатенация строк
Данная функция уже не раз применялась нами в ранних уроках и
предназначена она для объединения двух строк в одну. В этих целях используется
оператор “.” (точка). При использовании данного оператора все элементы
выражения будут восприниматься, как строки и результат, соответственно, также
будет принимать строковый тип:
$var = “Переменная var1 = ”.$var1;
Также, помимо оператора “.” в некоторых командах, таких как, например, echo,
есть возможность вставлять элементы выражения для объединения в строку прямо
в результат вывода:
echo “Result: $var1 and $var2 = $var3”;
При этом стоит помнить о правиле использования кавычек, но не апострофов,
иначе все элементы строки будут восприняты, как символы, но не переменные или
инструкции.

Сравнение строк
Ранее Вы уже изучали вопрос сравнения переменных в уроках 14 и 16. Но есть
особенность использования оператора сравнения именно при использовании
строк.
Все дело здесь в том, что оператор == и != приравнивают пустую строку «» к
нулю и, соответственно, в условных операторах или условиях циклов пустая строка
будет соответствовать значению false.
Об этой особенности стоит помнить, т. к. если при операциях сравнения
используется не две строки, а строка и какой-либо другой тип, пустая строка будет
воспринята именно как false.
Как и было сказано ранее, для строгого сравнения строк, в т. ч. пустых строк,
рекомендуется использовать операторы эквивалентности === и !==, которые
воспримут пустую строку или строку, содержащую числа с учетом их типа.
Для наглядности использования операторов сравнения и эквивалентности,
рассмотрим новую функцию strpos(), позволяющую найти в строке первую позицию
встречи заданного символа или набор символов:
int strpos(string $str, string $symb[, int $from = 0]);
В данной строке указываются следующие параметры:
- $str – строка, в которой будет произведен поиск искомых элементов;
- $symb – набор символов, который будет использован для поиска в строке.
Отдельно стоит отметить, что последовательность указанных элементов является
строгой и $symb = “+=” не эквивалентно $symb = “=+” при использовании strpos();
- необязательный параметр $from – указывает, с какого элемента строки
начинать поиск.
Рассмотрим особенности операторов сравнения в листинге 28.2.
Листинг 28.2. Оператор strpos() и операторы сравнения.

$str = "=!Новая строка != использующая символы !=";

2
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

//Использование оператора сравнения !=


$count = 0;
if(strpos($str, "=!") != false) {
$count++;
echo "Счетчик количества символов !=: $count";
}

//Использование оператора эквивалентности !==


$count = 0;
if(strpos($str, "=!") !== false) {
$count++;
echo "Счетчик количества символов !==: $count";
}

Как видно из результатов использования скрипта, в браузере выведен только


второй результат. Произошло это по причине того, что в первом случае, при
использовании оператора сравнения != первый случай встречи набора символов
“!=” был на первом элементе. Так как в PHP строки воспринимаются, как массивы
элементов, то первому символу в строке присваивается индекс (ключ) = 0. А 0 в
PHP равен false. В итоге мы получили выход из условного оператора по причине
выполнения условия сравнения. Во втором же случае, 0 оказался не эквивалентен
false и позволил вывести сообщение на экран.
В PHP существует еще одна функция, подобная strpos() – strrpos():
int strrpos(string $str, string $symb[, int $from = 0]);
Ее отличие лишь в том, что возвращает она последний случай встречи
искомых символа или набора символов.
Кроме указанных функций, в PHP возможно сравнение строк
лексикографически, по их содержимому:
int strcmp(string $str_1, string str_2);
Принцип ее действия – посимвольное сравнение каждого элемента строки.
Если один из элементов имеет меньший числовой код, то, соответственно, такая
строка считается меньше и наоборот. В результате работы, функция может
возвращать три результата значения: -1, если $str_1 < $str_2; 0, если $str_1
лексикографически эквивалентна $str_2 ($str_1 === $str_2) и 1, если $str_1 > $str_2.
Подразумеваются лексикографические < и >.
У этой функции есть аналог – strcasecmp().
Его отличием является только то, что при сравнении не учитывается регистр
символов.
Рассмотрим принцип работы этих функций на примере из листинга 28.3.
Листинг 28.3 Принцип работы функций strcmp() и strcasecmp()

$str_1 = "London is a capital of Great Britain";


$str_2 = "London is a capital of great britain";
$str_3 = "London is a Capital of Great Britain";

//Принцип работы функции strcmp()

3
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

echo "<p>Результат сравнения str_1 и str_2 функцией strcmp(): ".strcmp($str_1,


$str_2)."</p>";
echo "<p>Результат сравнения str_1 и str_3 функцией strcmp(): ".strcmp($str_1,
$str_3)."</p>";

//Принцип работы функции strcasecmp()


echo "<p>Результат сравнения str_1 и str_3 функцией strcasecmp():
".strcasecmp($str_1, $str_3)."</p>";

В результате работы скрипта у Вас получится следующий результат:


Результат сравнения str_1 и str_2: -1
Результат сравнения str_1 и str_3: 1
Результат сравнения str_1 и str_3: 0
Стоит, однако, заметить, что обе функции адекватно работают только при
использовании латинских букв алфавите в строках. При использовании кириллицы
или других языков, результат может оказаться неожиданным.