Учебник РНР (перевод Alexandr Pyramidin) Размещено на PHPClub.Net
Назад Глава 6. Типы Вперёд

Строки

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

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

Синтаксис

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

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

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

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

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

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

echo 'this is a simple string';
echo 'You can also have embedded newlines in strings,
like this way.';
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. Мнемоники символов
последовательностьзначение
\nlinefeed/прогон строки (LF или 0x0A (10) в ASCII)
\rcarriage return/возврат каретки (CR или 0x0D (13) в ASCII)
\thorizontal tab/горизонтальная табуляция (HT или 0x09 (9) в ASCII)
\\backslash/обратная наклонная черта
\$ знак dollar/доллар
\"double-quote/двойная кавычка
\[0-7]{1,3}последовательность символов, совпадающая с регулярным выражением, символ в 8-ричной нотации
\x[0-9A-Fa-f]{1,2} последовательность символов, совпадающая с регулярным выражением, символ в 16-ричной нотации

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

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

Heredoc

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

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

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

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

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

Heredoc текст ведёт себя так же, как строка в двойных кавычках. Это значит, что вам не нужно escape-ировать кавычки в heredocs, но можно продолжать использовать коды-мнемоники, перечисленные выше. Переменные разворачиваются, но с комплексными переменными в heredoc нужно работать так же внимательно, как и со строками.
Пример 6-2. Heredoc-пример строк в кавычках
 
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
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.";

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

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

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

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

$great = 'fantastic';
echo "This is { $great}"; // не будет работать, выведет: This is { fantastic}
echo "This is {$great}";  // работает, выведет: This is fantastic
echo "This square is {$square->width}00 centimeters broad."; 
echo "This works: {$arr[4][3]}";     

// Неверно по той же причине,
// так как $foo[bar] неверно вне строки.
echo "This is wrong: {$arr[foo][3]}"; 

echo "You should do it this way: {$arr['foo'][3]}";
echo "You can even write {$obj->values[3]->name}";
echo "This is the value of the var named $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";


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