Тип данных String

Строка в PHP - это набор символов любой длины, где символ - это то же самое, что и байт. В отличие от Си, строки могут содержать в себе также и нулевые символы, что никак не повлияет на программу. Иными словами, строки можно использовать для хранения бинарных данных. Длина строки ограничена только размером свободой оперативной памяти.

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

В PHP 7.0.0, на 64-битных платформах нет каких-либо достижимых ограничений для длины строки, в 32-битных системах и в более ранних версиях PHP, строки не могут быть более 2 Гб (2147483647 байт).

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

Синтаксис

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

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

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

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

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

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

					
	$str = 'I am user zamt.';
	echo $str; # I am user zamt.
	
	$str = 'I\'m user zamt.';
	echo $str; // I'm user zamt.
	
	$str = 'example with \\';
	echo $str; /* example with \ */
	
	$str = 'One \ two \t three \n parallel';
	echo $str; // One \ two \t three \n parallel
	
	echo 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. 
	Aenean commodo ligula eget dolor. Aenean massa. 
	Cum sociis natoque penatibus et magnis dis parturient montes, 
	nascetur ridiculus mus. Donec quam felis, ultricies nec';
					
				

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

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

Управляющие последовательности
ПоследовательностьЗначение
\nновая строка (LF или 0x0A (10) в ASCII)
\rвозврат каретки (CR или 0x0D (13) в ASCII)
\tгоризонтальная табуляция (HT или 0x09 (9) в ASCII)
\\обратная косая черта
\$знак доллара
\"двойная кавычка
Самым важным свойством строк в двойных кавычках является обработка переменных.

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

					
	echo "Просто двойные кавычки"; // Просто двойные кавычки
	
	$pi = 3.14;
	echo "\nЧисло ПИ \t = \t $pi \n"; // Посмотрите как отображается в браузере и консоле разработчика
	
	echo "Зато не страшно писать - ', а вот \" надо экранировать"; // Зато не страшно писать - ', а вот " надо экранировать
					
				

heredoc-синтаксис

Иногда нужно вывести из PHP большой объем текста, а использование нескольких инструкций echo заняло бы много времени и было бы неразумным.

Для этого нужно воспользоваться многострочной последовательностью, используя оператор <<<, который обычно называют here-document («здесь документ») или heredoc. Он представляет собой способ указания строкового литерала, сохраняющего в тексте обрывы строк и другие пустые пространства (включая отступы).

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

heredoc-синтаксис

					
	$int = 32;
	$heredoc = <<<_TXT
Душа моя озарена неземной радостью, 
как эти чудесные весенние утра, 
			$int
_TXT;
	
	echo $heredoc;
	
	
	$html = <<<_HTML
	<article>
		<h2>Пример использования heredoc</h2>
		<p<Когда надо вывести большой участок кода.</p>
		<p<Попробуйте поставить пробел или табуляцую после октрывающегося идентификатора или перед закрывающимся.</p>
	</article>	
_HTML;

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

Если это правило нарушено и закрывающий идентификатор не является "чистым", считается, что закрывающий идентификатор отсутствует и PHP продолжит его поиск дальше. Если в этом случае верный закрывающий идентификатор так и не будет найден, то это вызовет ошибку в обработке с номером строки в конце скрипта.

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

nowdoc-синтаксис

Nowdoc - это то же самое для строк в одинарных кавычках, что и heredoc для строк в двойных кавычках. Nowdoc похож на heredoc, но внутри него не осуществляется никаких подстановок. Эта конструкция идеальна для внедрения PHP-кода или других больших блоков текста без необходимости его экранирования.

Nowdoc указывается той же последовательностью <<<, что используется в heredoc, но последующий за ней идентификатор заключается в одинарные кавычки, например, <<<'EOT'. Все условия, действующие для heredoc идентификаторов также действительны и для nowdoc, особенно те, что относятся к закрывающему идентификатору.

nowdoc-синтаксис

					
	$int = 32;
	echo <<<'NOW'
$int - не будет подстановок как heredoc
и не работают \n \t \$ \"
Хочешь такие кавычки " или даже такие ' - всё равно
Главное правильно закрывать.
NOW;
					
				
Поддержка nowdoc была добавлена в PHP 5.3.0.

Обработка строк

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

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

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

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

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

					
	$simple = "I'am string";
	
	echo "Проснувшись однажды утром $simple после беспокойного сна, Грегор Замза обнаружил";
	// Проснувшись однажды утром I'am string после беспокойного сна, Грегор Замза обнаружил
	
	echo "Lorem ipsum dolor sit $simpleamet, consectetuer adipiscing elit".PHP_EOL;
	// ошибка!! нет такой переменной $simpleamet
					
				

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

Простой синтаксис. Объекты и массивы

					
	class User {
		public $name = "admin";
		public $age = 21;
	}
	
	$usr = new User();
	$arr = array("one", "two", "three");
	
	echo "Вы зашли под пользователем $usr->$name";
	echo "В качестве примера $arr[0] $arr[1] $arr[2]";
					
				

Сложный синтаксис

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

Любая скалярная переменная, элемент массива или свойство объекта, отображаемое в строку, может быть представлена в строке этим синтаксисом. Просто запишите выражение так же, как и вне строки, а затем заключите его в { и } . Поскольку { не может быть экранирован, этот синтаксис будет распознаваться только когда $ следует непосредственно за {. Используйте {\$, чтобы напечатать {$.

Сложный синтаксис

					
	$w = 450;
	$h = 640;
	
	echo "Width = $wpx \t Height = $hpx".PHP_EOL; //ERROR
	echo "Width = {$w}px \t Height = {$h}px".PHP_EOL;
	echo "Width = { $w}px \t Height = { $h}px".PHP_EOL; //BAD
	// Width = { 450}px \t Height = { 640}px
	
	/* СЛОЖНЫЕ ВЫРАЖЕНИЯ 1 */
	function getVar() {
		return "my_var";
	}
	
	$my_var = "You're crazy";
	echo "Пример сложного синтаксиса {${getVar()}}?".PHP_EOL;
	
	/* СЛОЖНЫЕ ВЫРАЖЕНИЯ 2 */
	$var = "Info";
	$name = "var";
	
	echo "{${$name}}rmation".PHP_EOL; // Information
					
				

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

Символы в строках можно использовать и модифицировать, определив их смещение относительно начала строки, начиная с нуля, в квадратных скобках после строки, например, $str[42]. Думайте о строке для этой цели, как о массиве символов.

Начиная с PHP 7.1.0, поддерживаются отрицательные значения смещения. Они задают смещение с конца строки.
К символу в строке также можно обращаться с помощью фигурных скобок, например, $str{42}.
Попытка записи в смещение за границами строки дополнит строку пробелами до этого смещения. Нецелые типы будет преобразованы в целые.

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

				
	$text = "Пример длинной строки.";
	$str = "Hello, User zamt!!";
	
	echo $text[4];
	
	invers($str);
	
	function invers($str) {
		for($i = strlen($str) - 1; $i >= 0; --$i)
			echo "\n" . $str{$i};
	}
				
			
Попытка доступа к переменным других типов (исключая массивы или объекты, реализующие определенные интерфейсы) с помощью [] или {} молча вернет NULL.

Строковые операторы

В PHP есть два оператора для работы со строками. Первый - оператор конкатенации ('.'), который возвращает строку, представляющую собой соединение левого и правого аргумента. Второй - оператор присваивания с конкатенацией ('.='), который присоединяет правый аргумент к левому.

Строковые операторы

				
	$empty = "";
	$empty .= "Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero";
	echo $empty.PHP_EOL; // GOOD
	
	$bad .= "Very bad idea"; // ERROR
	echo $bad.PHP_EOL;
				
			

Функции по работе со строками

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

Функции по работе со строками

				
	$str = "User zamt";
	
	echo "Length - " . strlen($str) . PHP_EOL;
	echo "Substring - " . substr($str, 2, 4) .PHP_EOL; // string, start, lenght
	echo "Comparisons - " .strcmp($str, "user Zamt") . PHP_EOL;
	echo "Symbol - " . chr(38) . PHP_EOL;
	echo "Lower - " . strtolower($str) . "\tUpper - " . strtoupper($str) . PHP_EOL;
				
			

Основные функции PHP по работе со строками

Проблемы при работе с русским текстом

Собственно проблемы возникают из-за того, что, к примеру русские символы в кодировке UTF-8 занимают больше чем один байт. Соответственно, php-функции для работы с текстом (strlen(), strpos(), substr()...) будут некорректно работать.

Решается эта проблема просто: в PHP есть встроенные мультибайтные аналоги строковым функциям. Эти функции отличаются от стандартных своим названием, каждое из которых начинается на префикс «mb_». Пример:mb_strlen(), mb_strpos(), mb_substr()...

Также у каждой из этих функций есть дополнительный параметр, указывающий кодировку.

				
	$str = 'абв'; 
	$len = strlen($str); // $len = 6 
	$len = mb_strlen($str);// $len = 6 !!! 
	$len = mb_strlen($str, 'UTF-8'); // $len = 3 
				
			

Многобайтные строки

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