Строки

Строка - это набор символов. В PHP символ это то же самое, что и байт, это значит, что возможно ровно 256 различных символов. Это также означает, что PHP не имеет встроенной поддержки Unicode'а. Некоторую поддержку Unicode'а обеспечивают эти функции utf8_enncode() и utf8_decode().

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

Синтаксис

Строка может быть определена тремя различными способами.

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

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

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

Замечание: В PHP 3 в данном случае будет выдано сообщение уровня E_NOTICE.

Замечание: В отличие от двух других синтаксисов, переменные, встречающиеся в строках, заключенных в одинарные кавычки, не обрабатываются.

echo ''это простая строка';
echo 'Вы можете вставлять в строки символ новой строки
таким образом';
echo 'Однажды Арнольд сказал: "I\'ll be back"';
// вывод: ... "I'll be back"
echo 'Вы уверены, что хотите удалить C:\\*.*?';
// вывод: ... удалить C:\*.*?
echo 'Вы уверены, что хотите удалить C:\*.*?';
// вывод: ... удалить C:\*.*?
echo 'Я пытаюсь вставить в этой точке: \n символ новой строки';
// вывод: ... в этой точке: \n символ новой строки

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

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

Таблица 7-1. Мнемоники символов

последовательностьзначение
\nновая строка (LF или 0x0A (10) в ASCII)
\rвозврат каретки (CR или 0x0D (13) в ASCII)
\tгоризонтальная табуляция (HT или 0x09 (9) в ASCII)
\\обратная наклонная черта
\$знак доллара
\"двойная кавычка
\[0-7]{1,3} последовательность символов, соответсвующая регулярному выражению, символ в восьмеричной системе счисления
\x[0-9A-Fa-f]{1,2} последовательность символов, соответсвующая регулярному выражению, символ в шестнадцатеричной системе счисления

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

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

Heredoc

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

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

Внимание

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

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

Пример 7-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 = 'МоеИмя';

echo <<<EOT
Меня зовут "$name". Я печатаю $foo->foo.
Теперь я вывожу {$foo->bar[1]}.
Это должно вывести заглавную букву 'A': \x41
EOT;
?>

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

Обработка переменных

Если строка определяется в двойных кавычках, либо при помощи heredoc, переменные внутри нее обрабатываются.

Существует два типа синтаксиса - простой и сложный. Простой синтаксис более легок и удобен, он дает возможность обработки переменной, значения массива или свойства объекта.

Сложный синтаксис был введен в PHP 4 и может быть распознан по фигурным скобкам, окружающих выражение.

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

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

$beer = 'Heineken';
echo "$beer's taste is great"; // работает, "'" это неверный символ для имени переменной
echo "He drank some $beers";   // не работает, 's' это верный символ для имени переменной
echo "He drank 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}}";

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

Символы в строках можно использовать, определив их смещение относительно начала строки, начиная с нуля, в фигурных скобках после строки.

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

Пример 7-3. Несколько примеров строк

<?php
// Получение первого символа строки
$str = 'Это тест.';
$first = $str{0};

// Получение последнего символа строки
$str = 'Это все еще тест.';
$last = $str{strlen($str)-1}; 
?>

Полезные функции и операторы

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

Для модификации строк существует множество полезных функций.

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

Также существуют функции для URL-строк, и функции для шифрования/дешифрования строк (mcrypt и mhash).

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

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

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

Логическое значение TRUE конвертируется в строку "1", а значение FALSE представляется как "" (пустая строка). Этим способом вы можете конвертировать значения в обе стороны из булева типа в строковый и наоборот.

Целое или число с плавающей точкой конвертируется в строку, представленную числом, состоящим из его цифр (включая показалтель степени для чисел с плавающей точкой).

Массивы всегда конвертируются в строку "Array", так что вы не можете отобразить содержимое массива, используя echo() или print(), чтобы узнать, что он содержит. Дополнительные советы вы можете найти ниже.

Объекты всегда конвертируются в строку "Object". Если вы хотите вывести значение переменной-члена объекта по причине отладки, прочтите следующие абзацы. Если вы хотите получить имя класса требуемого объекта, используйте функцию get_class().

Ресурсы всегда конвертируются в строки со структурой "Resource id #1", где 1 - это уникальный номер ресурса, присвоенный ему PHP во время выполнения. Если вы хотите получить тип ресурса, используйте функцию get_resource_type().

NULL всегда конвертируется в пустую строку.

Как вы могли видеть выше, вывод массивов, объектов или ресурсов не предоставляет вам никакой полезной информации о самих значениях. Более подходящий способ вывода значений для отладки - использовать функции print_r() и var_dump().

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

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

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

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

Значение определяется по начальной части строки. Если строка начинается с верного числового значения, будет использовано это значение. Иначе значением будет 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; тип: " . gettype ($foo) . "<br />\n";

Не ожидайте получить код символа, конвертировав его в целое (как вы могли бы сделать, например, в C). Для конвертации символов в их коды и обратно используйте функции ord() и chr().