Апострофи
Найпростіший спосіб означити рядок (string) — взяти його в
апострофи (наприклад 'це рядкове значення'
).
Щоб вписати в рядок апостроф, цей знак необхідно екранувати
оберненою косою рискою (\
). Щоб всередині рядкового
значення вписати обернену косу риску, треба продублювати її
(\\
). Всі наступні символи оберненої косої риски будуть
сприйматись буквально: це означає, що всі інші екрановані послідовності,
наприклад \r
або \n
будуть виводитись
буквально, а не як такі, що мають спеціальне значення.
Зауваження:
На відміну від
лапок
та синтаксису
heredoc,
змінні та екрановані
послідовності спеціальних символів не будуть
розкриті в рядках, взятих в апострофи.
Heredoc
Третій спосіб запису значення типу string — синтаксис heredoc:
<<<
. Після цього оператора слідують
мітка та символ нового рядка. Далі — власне, текст (string), а
потім та сама мітка з нового рядка. Вона позначає кінець тексту.
В кінці перед міткою можуть бути пропуски або символи табуляції. Тоді такі ж
відступи будуть видалені з початку усіх рядків тексту. До PHP 7.3.0, мітка в
кінці повинна бути одразу після символа нового рядка.
Також мітка має відповідати правилам називання міткок в PHP: містити тільки
букви, цифри, підкреслення та починатися з букви або підкреслення.
Приклад #1 Простий приклад Heredoc, починаючи з PHP 7.3.0
<?php
// без відступів
echo <<<МІТКА
а
б
в
\n
МІТКА;
// відступ з 4-х пропусків
echo <<<МІТКА
а
б
в
МІТКА;
В PHP 7.3 поданий вище приклад
виведе:
Якщо кінцева мітка відступає далі ніж будь-який рядок тексту, то викинеться
ParseError:
Приклад #2 Кінцева мітка не має відступати далі ніж будь-який рядок тексту
<?php
echo <<<МІТКА
а
б
в
МІТКА;
В PHP 7.3 поданий вище приклад
виведе:
PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4
Для відступу кінцевої мітки можна використовувати табуляцію, однак табуляція
та пропуски не повинні змішуватися у відступах тексту
чи кінцевої мітки. Інакше, буде викинуто ParseError.
Це обмеження було введено у зв'язку з тим, що змішування табуляції та
пропусків погіршує розбірливість коду.
Приклад #3 Різні відступи
<?php
// Увесь наступний код не працює.
// різні відступи в тексті (пропуски) та для кінцевої мітки (табуляція)
{
echo <<<МІТКА
а
МІТКА;
}
// змішування пропусків та табуляції в тексті
{
echo <<<МІТКА
а
МІТКА;
}
// змішування пропусків та табуляції для кінцевої мітки
{
echo <<<МІТКА
а
МІТКА;
}
В PHP 7.3 поданий вище приклад
виведе:
PHP Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8
Крапка з комою чи символ нового рядка після кінцевої мітки не є
обов'язковими. До прикладу, наступний код дозволений, починаючи з PHP 7.3.0:
Приклад #4 Продовження виразу після кінцевої мітки
<?php
$значення = [<<<МІТКА
а
б
в
МІТКА, 'г ґ д'];
var_dump($значення);
В PHP 7.3 поданий вище приклад
виведе:
array(2) {
[0]=>
string(14) "а
б
в"
[1]=>
string(8) "г ґ д"
}
Увага
Якщо назву мітки знайдено одразу після символу початку рядка, то навіть
якщо це була частина тексту, вона розглядатиметься як кінцева мітка, що
спричинить помилку ParseError.
Приклад #5 Кінцева мітка в тексті може викликати ParseError
<?php
$значення = [<<<МІТКА
а
б
МІТКА помічає кінець тексту
МІТКА, 'в г ґ'];
В PHP 7.3 поданий вище приклад
виведе:
PHP Parse error: syntax error, unexpected identifier "помічає", expecting "]" in example.php on line 5
Щоб уникнути цієї проблеми, безпечніше дотримуватися простого правила:
не обирати мітку, яка може з'явитися в тексті.
Увага
До PHP 7.3.0, необхідно слідкувати за тим, щоб рядок з кінцевою міткою не
містив нічого, крім самої мітки та крапки з комою (;
) за
нею. Це означає, що мітка не може відступати від
початку рядка, а також не може бути жодних пропусків чи табуляції перед чи
після крапки з комою. Також важливо, щоб символом перед кінцевою міткою
був символ нового рядка, визначений локальною операційною системою. Це
\n
в системах UNIX, включно з macOS. Також цей символ
має бути одразу після крапки з комою.
Якщо це правило порушено і кінцева мітка неправильна — вона не
вважатиметься такою, а PHP продовжить шукати кінцеву мітку. Якщо до кінця
поточного файлу мітку не буде знайдено, то на останньому рядку виникне
синтаксична помилка.
Приклад #6 Недійсна мітка, до версії PHP 7.3.0
<?php
class foo {
public $bar = <<<МІТКА
bar
МІТКА;
}
// Мітка повинна не мати відступів
?>
Приклад #7 Дійсна мітка, навіть до версії PHP 7.3.0
<?php
class foo {
public $bar = <<<МІТКА
bar
МІТКА;
}
?>
Дані рядкового типу в синтаксисі Heredoc, які містять змінні, не можна
використовувати для ініціалізації властивостей класу.
Текст Heredoc має ті ж особливості, що і рядок (string) в
лапках, просто без лапок. Це означає, що лапки в Heredoc не потрібно
екранувати, а перелічені вище екрановані послідовності досі можна
використовувати. Змінні так само розкриваються, а складні змінні записуються
тим же способом, що і в рядках (string).
Приклад #8 Вставлення інших рядків в Heredoc
<?php
$str = <<<EOD
Приклад тексту
з синтаксисом heredoc,
що складається з кількох рядків.
EOD;
/* Складніший приклад, зі змінними. */
class foo
{
var $foo;
var $bar;
function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Петро';
echo <<<EOT
Мене звати $name. Я друкую $foo->foo.
Зараз я друкую {$foo->bar[1]}.
Має надрукуватись велика буква 'A': \x41
EOT;
?>
Поданий вище приклад
виведе:
Мене звати Петро. Я друкую Foo.
Зараз я друкую Bar2.
Має надрукуватись велика буква 'A': A
Також можливо використовувати Heredoc-синтаксис для передавання параметрів
до функції:
Приклад #9 Heredoc в значеннях параметрів
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
Можна задавати значення статичним змінним та властивостям/константам класу,
використовуючи синтаксис Heredoc:
Приклад #10 Heredoc як статичне значення
<?php
// Поле класу
function foo()
{
static $bar = <<<LABEL
Тут нічого цікавого...
LABEL;
}
// Властивість, константа класу
class foo
{
const BAR = <<<FOOBAR
Приклад константи
FOOBAR;
public $baz = <<<FOOBAR
Приклад властивості
FOOBAR;
}
?>
Початкову мітку Heredoc можна брати в лапки:
Приклад #11 Використання лапок в Heredoc
<?php
echo <<<"FOOBAR"
Привіт, світ!
FOOBAR;
?>
Nowdoc
Синтаксис nowdoc стосується рядків в апострофах, як heredoc — рядків в
лапках, тобто працює схожим способом до heredoc, але без
інтерполяції тексту всередині. Така конструкція прекрасно
підходить для вставлення PHP-коду або великих частин тексту без необхідності
їхнього екранування. Цей синтаксис має деякі спільні риси з конструкцією
SGML <![CDATA[ ]]>
, оскільки він оголошує блок
тексту, який не підлягає аналізу.
Nowdoc починається з тої ж послідовності <<<
, що
й heredocs, але назва мітки, що йде далі, береться в апострофи, напр.
<<<'EOT'
. Усі правила щодо міток heredoc
застосовуються також до міток nowdoc, особливо ті, що стосуються кінцевої
мітки.
Приклад #12 Приклад тексту nowdoc
<?php
echo <<<'МІТКА'
Приклад тексту з кількома рядками
з використанням синтаксису nowdoc.
Зворотні косі риски завжди спиймаються буквально, напр. \\ і \'.
МІТКА;
Поданий вище приклад
виведе:
Приклад тексту з кількома рядками
з використанням синтаксису nowdoc.
Зворотні косі риски завжди спиймаються буквально, напр. \\ і \'.
Приклад #13 Текст nowdoc зі змінними всередині
<?php
class foo
{
public $foo;
public $bar;
function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Петро';
echo <<<'EOT'
Мене звати $name. Я друкую $foo->foo.
Зараз я друкую {$foo->bar[1]}.
Має НЕ надрукуватись велика буква 'A': \x41
EOT;
?>
Поданий вище приклад
виведе:
Мене звати $name. Я друкую $foo->foo.
Зараз я друкую {$foo->bar[1]}.
Має НЕ надрукуватись велику буква 'A': \x41
Приклад #14 Зі статичними даними
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Інтерполяція рядка
Якщо рядок (string) записано в лапках або в heredoc, то
в нього можна вставляти змінні.
Є два способи запису:
основний та
розширений.
Основний синтаксис є найпоширенішим і найзручнішим. Він надає можливість
вбудувати змінну, значення масиву (array), або властивість
об'єкта (object) в рядок (string) з невеликими
зусиллями.
Основний синтаксис
Якщо трапляється знак долара ($
), а після — символи, що
є допустимими у назві змінної, то така послідовність вважається, власне,
змінною, а в текст замість неї підставляється її рядкове значення.
Формально, структура основного синтаксису підставлення змінних є такою:
Увага
Синтаксис ${ вираз }
є застарілим, починаючи з PHP
8.2.0, оскільки його можна інтерпретувати як
змінну змінної:
В такому випадку використовується
розширений
синтаксис інтерполяції рядка.
Зауваження:
Якщо не вдається сформувати прийнятну назву змінної, то знак долара
відтворюється в рядку буквально:
Приклад #15 Інтерполяція значення першого виміру масиву або властивості
<?php
$juices = array("яблучний", "апельсиновий", "string_key" => "фіолетовий");
echo "Він випив $juices[0] сік.";
echo PHP_EOL;
echo "Він випив $juices[1] сік.";
echo PHP_EOL;
echo "Він випив $juices[string_key] сік.";
echo PHP_EOL;
class A {
public $s = "рядок";
}
$o = new A();
echo "Значення об'єкту: $o->s.";
?>
Поданий вище приклад
виведе:
Він випив яблучний сік.
Він випив апельсиновий сік.
Він випив фіолетовий сік.
Значення об'єкту: рядок.
Зауваження:
Ключ масиву не повинен бути в лапках чи апострофах, і тому не можна
посилатися на константу як на ключ за допомогою основного синтаксису. Для
цього використовується розширений
синтаксис.
Починаючи з PHP 7.1.0, підтримуються від'ємні
цілочисельні індекси.
Приклад #16 Від'ємні цілочисельні індекси
<?php
$string = 'string';
echo "Символ з індексом -2 є \"$string[-2]\".", PHP_EOL;
$string[-3] = 'o';
echo "Зміна символа з індексом -3 на \"o\" дає \"$string\".", PHP_EOL;
?>
Поданий вище приклад
виведе:
Символ з індексом -2 є "n".
Зміна символа з індексом -3 на "o" дає "strong".
Для чогось складнішого використовується розширений
синтаксис.
Розширений синтаксис
Розширений синтаксис дозволяє інтерполяцію змінних
довільної форми.
Будь-яка скалярна змінна, елемент масиву або властивість об'єкту
(static чи ні) з рядковим (string)
представленням можна вставити в рядок за допомогою цього синтаксису. Вираз
записується так, як він виглядає поза рядком (string) та
береться в фігурні дужки ({
та }
).
Оскільки {
не екранується, то цей синтаксис правильний
тільки, якщо $
слідує одразу після {
.
Щоб буквально вивести послідовність {$
, треба записати
її так: {\$
. Ось кілька прикладів для наочності:
Зауваження:
Оскільки розширений синтаксис підтримує довільні вирази, то використання
змінних змінних —
дозволено.
Зміна рядка та посимвольне редагування
Доступ до символа в рядку (string) можна отримати, як до
елемента масиву (array), вказавши в квадратних дужках позицію
символа, рахуючи від нуля, наприклад, $str[42] (43-й
символ рядка str). Тобто, з цією метою потрібно вважати
рядок (string) масивом (array) символів. Функції
substr() та substr_replace() можна
використати для зчитування або заміни більше ніж одного символа.
Зауваження:
Починаючи з PHP 7.1.0, також підтримуються від'ємні позиції. Їх
відраховують з кінця рядка. Раніше використання від'ємних позицій викликало
повідомлення E_NOTICE
під час зчитування (повертаючи
порожній рядок) та E_WARNING
під час запису (не
змінюючи рядка).
Зауваження:
До PHP 8.0.0, з тією самою метою рядки (string) підтримують
фігурні дужки, напр. $str{42}. Такий синтаксис
застарілий, починаючи з PHP 7.4.0, та видалений в PHP 8.0.0.
Увага
Запис в позицію за межами рядка доповнює рядок пропусками. Не цілочисельні
позиції перетворюються в цілі числа. Якщо задано недопустимий тип позиції,
виводиться E_WARNING
. Записується тільки перший символ
заданого рядка. Починаючи з PHP 7.1.0, заданий порожній рядок викликає
фатальну помилку. Раніше, він перетворювався в NULL-байт.
Увага
Всередині інтерпретатора рядки є масивами байтів. Як наслідок, доступ до
рядка або його редагування, як масиву, не є безпечним для багатобайтових
кодувань і має здійснюватися лише з рядками в однобайтовому кодуванні,
наприклад, ISO-8859-1.
Зауваження:
Починаючи з PHP 7.1.0, застосування порожнього оператора індексу до
порожнього рядка призводить до фатальної помилки. Раніше порожній рядок
автоматично перетворювався на масив.
Приклад #17 Some string examples
<?php
// Get the first character of a string
$str = 'This is a test.';
$first = $str[0];
// Get the third character of a string
$third = $str[2];
// Get the last character of a string.
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// Modify the last character of a string
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
String offsets have to either be integers or integer-like strings,
otherwise a warning will be thrown.
Приклад #18 Example of Illegal String Offsets
<?php
$str = 'abc';
var_dump($str['1']);
var_dump(isset($str['1']));
var_dump($str['1.0']);
var_dump(isset($str['1.0']));
var_dump($str['x']);
var_dump(isset($str['x']));
var_dump($str['1x']);
var_dump(isset($str['1x']));
?>
Поданий вище приклад
виведе:
string(1) "b"
bool(true)
Warning: Illegal string offset '1.0' in /tmp/t.php on line 7
string(1) "b"
bool(false)
Warning: Illegal string offset 'x' in /tmp/t.php on line 9
string(1) "a"
bool(false)
string(1) "b"
bool(false)
Зауваження:
Accessing variables of other types (not including arrays or objects
implementing the appropriate interfaces) using []
or
{}
silently returns null
.
Зауваження:
Characters within string literals can be accessed
using []
or {}
.
Зауваження:
Accessing characters within string literals using the
{}
syntax has been deprecated in PHP 7.4.
This has been removed in PHP 8.0.