Учебник РНР
Назад Глава 6. Типы Вперёд

Строки

string это серия символов. В PHP символ это то же самое, что и байт, то есть имеется точно 256 различных возможных символов. Это также предполагает, что в PHP нет встроенной поддержки Unicode.

Примечание: строки могут быть очень большими. Практически нет ограничений на размер строк в PHP, поэтому нет никаких причин заботиться о длине строк.

Синтаксис

Строковой литерал может специфицироваться тремя способами.

Одинарные кавычки

Простейший способ специфицировать строку - заключить её в одинарные кавычки (символ ').

Для специфицирования литеральной одинарной кавычки вам нужно мнемонизировать/escape её с помощью backslash (\), как во многих других языках. Если backslash должен появиться перед одинарной кавычкой или в конце строки, нужно его удвоить. Обратите внимание, что если вы захотите мнемонизировать любой другой символ, backslash также будет напечатан! Поэтому обычно нет необходимости мнемонизировать сам backslash.

Примечание: в PHP 3 при этом будет выведено предупреждение уровня E_NOTICE.

Примечание: в отличие от двух других видов синтаксиса, переменные здесь не разворачиваются (не обсчитываются), когда находятся внутри строки, заключённой в одинарные кавычки.

echo 'Это простая строка.'; echo 'Вы можете также внедрять в строки символы newline, как здесь.'; echo 'Arnold once said: "I\'ll be back"'; // на выходе: ... "I'll be back" echo 'Are you sure you want to delete C:\\*.*?'; // на выходе: ... delete C:\*.*? echo 'Are you sure you want to delete C:\*.*?'; // на выходе: ... delete C:\*.*? echo 'I am trying to include at this point: \n a newline'; // на выходе: ... this point: \n a newline

Двойные кавычки

Если строка заключена в двойные кавычки ("), PHP понимает б́ольшее количество escape-последовательностей (мнемоник) специальных символов:

Таблица 6-1. Мнемоники символов
последовательность значение
\n linefeed/прогон строки (LF или 0x0A (10) в ASCII)
\r carriage return/возврат каретки (CR или 0x0D (13) в ASCII)
\t horizontal tab/горизонтальная табуляция (HT или 0x09 (9) в ASCII)
\\ backslash/обратная наклонная черта
\$ знак dollar/доллар
\" double-quote/двойная кавычка
\[0-7]{1,3} последовательность символов, совпадающая с регулярным выражением, символ в 8-ричной нотации
\x[0-9A-Fa-f]{1,2} последовательность символов, совпадающая с регулярным выражением, символ в 16-ричной нотации

Ещё раз напоминает, что если вы захотите мнемнонизировать любой другой символ, backslash также будет напечатан!

Но самым важным свойством строки, заключённой в двойные кавычки, является то, что имена переменных разворачиваются. См. разбор строк.

Heredoc

Другой способ ограничения строки - использовать синтаксис heredoc ("<<<"). После <<< необходимо предоставить идентификатор, затем строку, а затем - тот же идентификатор как закрывающую кавычку.

Закрывающий идентификатор обязан начинаться в первом столбце строчки. Используемый идентификатор также обязан следовать тем же правилам именования, что и все другие метки в PHP:
он может содержать только алфавитные символы, числа и символ подчёркивания и обязан начинаться с не-цифры или с символа подчёркивания.

Предупреждение!

Важно отметить, что строчка с закрывающим идентификатором не содержит больше никаких символов, за исключением, возможно, точки с запятой (;). Это означает, что идентификатор не может вводится с отступом и что не может быть никаких пробельных символов и знаков табуляции до и после точки с запятой.

Самое, возможно, неприятное, что в конце строки не может быть также и символа carriage return ( \r), только form feed, AKA newline (\n). Поскольку Microsoft Windows использует последовательность \r\n как терминатор строки, ваш heredoc может не сработать, если вы запишете ваш скрипт в редакторе под Windows. Однако большинство программ-редакторов дают возможность сохранять ваши файлы с терминатором строк UNIX.

Heredoc текст ведёт себя так же, как строка в двойных кавычках. Это значит, что вам не нужно мнемонизировать кавычки в heredocs, но можно продолжать использовать коды-мнемоники, перечисленные выше. Переменные разворачиваются, но с комплексными переменными в heredoc нужно работать так же внимательно, как и со строками.

Пример 6-2. Heredoc-пример строк в кавычках
<?php $str = <<<EOD Пример строки, захватывающей несколько строчек, с использованием синтаксиса heredoc. EOD; /* Более сложный пример, с переменными. */ class foo { var $foo; var $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<EOT My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': \x41 EOT; ?>

Примечание: поддержка heredoc была введена в PHP 4.

Разбор переменных

Когда строка специфицируется двойными кавычками или heredoc, переменные внутри неё разбираются.

Есть два типа синтаксиса: простой и сложный. Простой синтаксис более распространён и удобнее, он предоставляет способ разбора переменной, переменной массива или свойства объекта.

Сложный синтаксис был введён в PHP 4 и может распознаваться по фигурным скобкам {} вокруг выражения.

Простой синтаксис

Если обнаружен знак dollar ($), разборщик захватывает как можно больше лексем для образования правильного имени. Заключайте имя переменной в фигурные скобки, если вы хотите явным образом специфицировать конец имени.

$beer = 'Heineken'; echo "$beer's taste is great"; // не будет работать, "'" это неправильный // символ для имён переменных (у меня работает - прим. пер.) echo "He drunk some $beers"; // работает, 's' это правильный символ // для имён переменных echo "He drunk some ${beer}s"; // работает

Аналогично вы можете заставить разобрать индекс массива или свойство объекта. В индексах массивов закрывающая квадратная скобка (]) обозначает конец индекса. Для свойств объекта применяются те же правила, что и для простых переменных, хотя со свойствами объекта невозможен трюк, как с переменными.

$fruits = array( 'strawberry' => 'red' , 'banana' => 'yellow' ); // заметьте, что это работает по-другому вне закавыченной строки. echo "A banana is $fruits[banana]."; echo "This square is $square->width meters broad."; // не будет работать. Для решения см. сложный синтаксис. echo "This square is $square->width00 centimeters broad.";

Для чего-либо более сложного вы должны использовать сложный синтаксис.

Сложный (фигурный) синтаксис

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

Фактически вы можете включать любое значение, которое находится в пространстве имён строки с этим синтаксисом. Вы просто записываете выражение тем же способом, что и вне строки, а затем окружаете его символами { и }. Поскольку вы не может заменить '{' мнемоникой, этот синтаксис будет распознаваться, только когда $ идёт непосредственно после {.
(Используйте "{\$" или "\{$" для получения литерала "{$").
Вот некоторые примеры для пояснения:

$great = 'fantastic'; echo "This is { $great}"; // не будет работать, выведет: This is { fantastic} echo "This is {$great}"; // работает, выведет: This is fantastic echo "Это квадрат шириной {$square->width}00 сантиметров."; echo "Это работает: {$arr[4][3]}"; // Неверно по той причине, // что $foo[bar] неверно вне строки. echo "Это неправильно: {$arr[foo][3]}"; echo "Вы должны сделать это так: {$arr['foo'][3]}"; echo "Вы можете даже записать {$obj->values[3]->name}"; echo "Это значение переменной $name: {${$name}}";

Доступ к символу в строке

Можно получить доступ к символам в строке путём специфицирования смещения с базой 0 в фигурных скобках для нужного символа.

Примечание: для обеспечения обратной совместимости вы можете по-прежнему использовать скобки массива. Однако этот синтаксис не рекомендуется, начиная с PHP 4.

Пример 6-3. Некоторые примеры строк
<?php /* Присвоение строкового значения. */ $str = "This is a string"; /* Присоединение к ней. */ $str = $str . " with some more text"; /* Другой способ присоединения с мнемоникой для newline. */ $str .= " and a newline at the end.\n"; /* Эта строка будет выглядеть '<p>Number: 9</p>' */ $num = 9; $str = "<p>Number: $num</p>"; /* А эта - '<p>Number: $num</p>' */ $num = 9; $str = '<p>Number: $num</p>'; /* Получить первый символ строки */ $str = 'This is a test.'; $first = $str{0}; /* Получить последний символ строки */ $str = 'This is still a test.'; $last = $str{strlen($str)-1}; ?>

Используемые функции

Строки можно объединять (конкатенировать) с помощью операции '.' (точка). Заметьте, что операция сложения '+' здесь не работает. См. также раздел Строковые операции.

Имеется большое количество функций для работы со строками.

См. раздел строковых функций, функции регулярных выражений для продвинутого поиска & замены (в двух частях: Perl и POSIX расширенный).

Имеются также функции для работы с URL-строками и функции для кодирования/декодирования строк (mcrypt и mhash).

Наконец, если вы ещё не нашли то, что нужно, посмотрите функции для символьного типа.

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

Когда строка вычисляется как числовое значение, результирующее значение и его тип определяются так.

Строка вычисляется как float , если содержит любой из символов '.', 'e' или 'E'. Иначе она вычисляется как integer.

Значение даётся по начальной части строки. Если строка начинается с правильного числового значения, используется это значение. Иначе значение будет 0 (нуль). Верным числовым символом является знак с последующими одной или более цифрами (с возможной десятичной точкой), с последующей необязательной экспонентой. Экспонента это 'e' или 'E' с последующими одной или более цифрами.

$foo = 1 + "10.5"; // $foo это float (11.5) $foo = 1 + "-1.3e3"; // $foo это float (-1299) $foo = 1 + "bob-1.3e3"; // $foo это integer (1) $foo = 1 + "bob3"; // $foo это integer (1) $foo = 1 + "10 Small Pigs"; // $foo это integer (11) $foo = 4 + "10.2 Little Piggies"; // $foo это float (14.2) $foo = "10.0 pigs " + 1; // $foo это float (11) $foo = "10.0 pigs " + 1.0; // $foo это float (11)

Дополнительно об этой конвертации см. учебник Unix, страницы о strtod(3).

Если вы хотите протестировать любой из примеров этого раздела, вы может скопировать его и вставить следующую строку, чтобы посмотреть, что будет:

echo "\$foo==$foo; type is " . gettype ($foo) . "<br />\n";

Назад Оглавление Вперёд
Числа с плавающей точкой Вверх Массивы