РНР 5 в подлиннике

Страница 153 из 554


ГЛАВА 1 5

Строковые функции

Листинги данной главы можно найти в подкаталоге string.

Строки в РНР — одни из самых универсальных объектов. Как мы уже видели, любой, сколь угодно сложный объект можно упаковать в строку при помощи функции serialize;) (и обратно через unserialize о). Строка может содержать абсолютно любые символы с кодами от 0 до 255 включительно. Нет никакого специального маркера "конца строки", как это сделано в языке С (там конец строки помечается символом с нулевым кодом). А значит, длина строки во внутреннем представлении РНР хранится где-то отдельно. Для формирования и вставки непечатаемого символа в строку (например, с кодом 1 или 15) используется функция спг(), которую мы рассмотрим в разд. "Работа с одиночными символами".

Наконец, из-за слабого контроля типов в РНР строка может содержать (и часто содержит) число, причем с ней можно работать, как с числом: прибавлять другие числа, умножать и т. д. При этом все преобразования (в десятичной системе) производятся автоматически. Существуют также функции, преобразующие число, записанное в различных системах счисления (например, в восьмеричной), в обычное представление, и наоборот. Их мы обсудим позже, в следующей главе.

В этой главе мы описываем только самые употребительные и удобные функции (около 80%), пропуская все остальные. Какие-то из не вошедших в данную главу функций (например, quotemeta ()) мы будем рассматривать в других главах. Так что, не найдя описание интересующей вас функции здесь, подумайте: возможно, оно лучше подходит для другой темы и его лучше поискать там? И наконец, последней инстанцией для вас, конечно же, должна являться документация РНР.

Самая, пожалуй, распространенная операция со строками — это их конкатенация, или присоединение к одной строке другой. В ранних версиях РНР для этого, как и для сложения чисел, использовался оператор +, что постоянно приводило к путанице: если к числу прибавляется строка, что должно получиться — число или строка? Если число, то вдруг наша строка содержала на самом деле не число, а какой-то

Конкатенация строк

312

Часть IV. Стандартные функции РНР

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

Оператор "." всегда воспринимает свои операнды как строки и возвращает строку. Если один из операндов не может быть переведен в строковое представление, т. е. если это массив или объект, то он воспринимается как строки array и object соответственно. Вообще говоря, это правило применимо и не только при сцеплении строк, но и при передаче такого операнда в какую-нибудь стандартную функцию, которой требуется строка. Например, следующие команды выведут слово Array:

$а = array(10, 20, 30);

echo $а // Внимание! Неожиданный результат!

Есть и другой, более специализированный, способ конкатенации строк. Он обычно используется, когда значения строковых или числовых переменных перемежаются с обычными словами. Если, к примеру, мы в программе работаем с датой и временем,

ПреДСТавлеННЫМИ СОВОКУПНОСТЬЮ Переменных ($day, $month, $year, $hour, $min,

$sec), то вывести строку вида "Все началось 19 февраля 1998 года, в 13:24:18" можно так:

echo "Все началось $day $month $уеаг года, в $hour:$min:$sec";

При этом в строку, вырабатываемую инструкцией echo, автоматически в нужных местах вставятся значения наших переменных. Это позволяет констатировать тот факт, что в РНР все переменные начинаются с $.

string str_repeat(string $st, string $number)

Функция "повторяет" строку $st Snumber раз и возвращает объединенный результат. Вот пример:

echo str_repeat("test!",3); // выводит test!test!test!

О сравнении строк

Теперь мы хотели бы рассмотреть одно тонкое место в интерпретаторе РНР, касающееся работы со строками. (Собственно, мы уже затрагивали эту тему, когда говорили об операторах сравнения.) Если мы используем операторы сравнения == и ! = (или любые другие, которые могут потребовать перевода строки в число) с операндами-строками, то результат, вопреки ожиданиям, не всегда оказывается верным. Чаще всего это проявляется как раз в инструкции if. Примеры приведены в листинге 15.1.

I Листинг 15.1. Файл compare.php

<?php ## Особенности операторов сравнения применительно к строкам.

$опе =1; // Число один.

$zero = 0; // Присваиваем число нуль.

if ($опе == "") echo 1; // Очевидно, не равно — не выводит 1.




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006