Строки (Часть 2)
Обработка строк
Если строка определяется в двойных кавычках, либо при помощи heredoc, переменные внутри нее обрабатываются.
Существует два типа синтаксиса: простой и сложный. Простой синтаксис более легок и удобен. Он дает возможность обработки переменной, значения массива (array) или свойства объекта (object).
Сложный синтаксис был введен в PHP 4 и может быть распознан по фигурным скобкам, окружающих выражение.
Простой синтаксис
Если интерпретатор встречает знак доллара ($), он захватывает так много символов, сколько возможно, чтобы сформировать правильное имя переменной. Если вы хотите точно определить конец имени, заключайте имя переменной в фигурные скобки.
<?php
$beer = 'Heineken';
echo "$beer's taste is great"; // работает, "'" это неверный символ для имени переменной
echo "He drank some $beers"; // не работает, 's' это верный символ для имени переменной
echo "He drank some ${beer}s"; // работает
echo "He drank some {$beer}s"; // работает
?>
Точно также могут быть обработаны элемент массива (array) или свойство объекта (object). В индексах массива закрывающая квадратная скобка (]) обозначает конец определения индекса. Для свойств объекта применяются те же правила, что и для простых переменных, хотя с ними невозможен трюк, как с переменными.
<?php
// Эти примеры специфически об использовании массивов внутри
// строк. Вне строк всегда заключайте строковые ключи вашего
// массива в кавычки и не используйте вне строк {скобки}.
// Давайте покажем все ошибки
error_reporting(E_ALL);
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
// Работает, но заметьте, что вне кавычек строки это работает по-другому
echo "A banana is $fruits[banana].";
//Работает
echo "A banana is {$fruits['banana']}.";
// Работает, но PHP, как описано ниже, сначала ищет
// константу banana.
echo "A banana is {$fruits[banana]}.";
// Не работает, используйте фигурные скобки. Это вызовет ошибку обработки.
echo "A banana is $fruits['banana'].";
// Работает
echo "A banana is " . $fruits['banana'] . ".";
// Работает
echo "This square is $square->width meters broad.";
// Не работает. Для решения см. сложный синтаксис.
echo "This square is $square->width00 centimeters broad.";
?>
Для более сложных задач вы можете использовать сложный синтаксис.
Сложный (фигурный) синтаксис
Данный синтаксис называется сложным не потому, что труден в понимании, а потому что позволяет использовать сложные выражения.
Фактически, вы можете включить любое значение, находящееся в пространстве имени в строке с этим синтаксисом. Вы просто записываете выражение таким же образом, как и вне строки, а затем заключаете его в { и }. Поскольку вы не можете экранировать '{', этот синтаксис будет распознаваться только когда $ следует непосредственно за {. (Используйте "{\$" или "\{$" чтобы отобразить "{$"). Несколько поясняющих примеров:
<?php
// Давайте покажем все ошибки
error_reporting(E_ALL);
$great = 'fantastic';
// Не работает, выведет: This is { fantastic}
echo "This is { $great}";
// Работает, выведет: This is fantastic
echo "This is {$great}";
echo "This is ${great}";
// Работает
echo "Этот квадрат шириной {$square->width}00 сантиметров.";
// Работает
echo "Это работает: {$arr[4][3]}";
// Это неверно по той же причине, что и $foo[bar] неверно вне
// строки. Другими словами, это по-прежнему будет работать,
// но поскольку PHP сначала ищет константу foo, это вызовет
// ошибку уровня E_NOTICE (неопределенная константа).
echo "Это неправильно: {$arr[foo][3]}";
// Работает. При использовании многомерных массивов, внутри
// строк всегда используйте фигурные скобки
echo "Это работает: {$arr['foo'][3]}";
// Работает.
echo "Это работает: " . $arr['foo'][3];
echo "Вы даже можете записать {$obj->values[3]->name}";
echo "Это значение переменной по имени $name: {${$name}}";
?>
Доступ к символу в строке и его изменение:
Символы в строках можно использовать и модифицировать, определив их смещение относительно начала строки, начиная с нуля, в фигурных скобках после строки. Приведем примеры:
<?php
// Получение первого символа строки
$str = 'Это тест.';
$first = $str{0};
// Получение третьего символа строки
$third = $str{2};
// Получение последнего символа строки
$str = 'Это все еще тест.';
$last = $str{strlen($str)-1};
// Изменение последнего символа строки
$str = 'Посмотри на море';
$str{strlen($str)-1} = 'я';
?>
Строковые функции и операторы
Строковые операторы
Конкатенация строк:
В различных языках программирования используются различные операторы конкатенации (объединения) строк. Например, в Pascal используется оператор "+". Использование в PHP оператора "+" для конкатенации строк некорректно: если строки содержат числа, то вместо объединения строк будет выполнена операция сложения двух чисел.
В PHP есть два оператора, выполняющие конкатенацию.
Первый - оператор конкатенации ('.'), который возвращает объединение левого и правого аргумента.
Второй - оператор присвоения с конкатенацией, который присоединяет правый аргумент к левому.
Приведем конкретный пример:
<?php
$a = "Hello ";
$b = $a . "World!"; // $b содержит строку "Hello World!" - Это конкатенация
$a = "Hello ";
$a .= "World!"; // $a содержит строку "Hello World!" - Это присвоение с конкатенацией
?>
Операторы сравнения строк
Для сравнения строк не рекоммендуется использовать операторы сравнения == и !=, поскольку они требуют преобразования типов. Пример:
<?php
$x=0;
$y=1;
if ($x == "") echo "<p>x - пустая строка</p>";
if ($y == "") echo "<p>y - пустая строка</p>";
// Выводит:
// x - пустая строка
?>
Данный скрипт сообщает нам, что $x - пустая строка. Это связано с тем, что пустая строка ("") трактуется прежде всего как 0, а только затем - как "пусто". В PHP операнды сравниваются, как строки, только в том случае, если оба они - строки. В противном случае они сравниваются как числа. При этом любая строка, которую PHP не удается перевести в число (в том числе и пустая строка), будет восприниматься как 0.
Примеры сравнения строк:
<?php
$x="Строка";
$y="Строка";
$z="Строчка";
if ($x == $z) echo "<p>Строка X равна строке Z</p>";
if ($x == $y) echo "<p>Строка X равна строке Y</p>";
if ($x != $z) echo "<p>Строка X НЕ равна строке Z</p>";
// Выводит:
// Строка X равна строке Y
// Строка X НЕ равна строке Z
?>
Чтобы избежать путанницы и преобразования типов, рекоммендуется пользоваться оператором эквивалентности при сравнении строк. Оператор эквивалентности позволяет всегда корректно сравнивать строки, поскольку сравнивает величины и по значению, и по типу:
<?php
$x="Строка";
$y="Строка";
$z="Строчка";
if ($x === $z) echo "<p>Строка X равна строке Z</p>";
if ($x === $y) echo "<p>Строка X равна строке Y</p>";
if ($x !== $z) echo "<p>Строка X НЕ равна строке Z</p>";
// Выводит:
// Строка X равна строке Y
// Строка X НЕ равна строке Z
?>
Смотрите также: Операторы сравнения
Продолжение (Часть 3) >>>