Heredoc
Третий способ определения строк в PHP — это использование heredoc-синтаксиса: <<<. После этого оператора необходимо указать идентификатор, затем перевод строки. После этого идет сама строка, а потом этот же идентификатор, закрывающий вставку.
Строка должна начинаться с закрывающего идентификатора, т.е. он должен стоять в первом столбце строки. Кроме того, идентификатор должен соответствовать тем же правилам именования, что и все остальные метки в PHP: содержать только буквенно-цифровые символы и знак подчеркивания, и не должен начинаться с цифры (знак подчеркивания разрешается).
Внимание
Очень важно отметить, что строка с закрывающим идентификатором не должна содержать других символов, за исключением точки с запятой (;). Это означает, что идентификатор не должен вводиться с отступом и что не может быть никаких пробелов или знаков табуляции до или после точки с запятой. Важно также понимать, что первым символом перед закрывающим идентификатором должен быть символ новой строки, определенный в вашей операционной системе. Например, в UNIX системах, включая Mac OS X, это \n. После закрывающего идентификатора также сразу должна начинаться новая строка.
Если это правило нарушено и закрывающий идентификатор не является «чистым», считается, что закрывающий идентификатор отсутствует и PHP продолжит его поиск дальше. Если в этом случае верный закрывающий идентификатор так и не будет найден, то это вызовет ошибку парсинга с номером строки в конце скрипта.
Пример #1 Пример неправильного синтаксиса
<?php class foo { public $bar = <<<EOT bar EOT; // отступ перед закрывающим идентификатором недопустим } ?>
Пример #2 Пример правильного синтаксиса
<?php class foo { public $bar = <<<EOT bar EOT; } ?>
Heredoc не может быть использован для инициализации полей класса. Начиная с версии PHP 5.3, это ограничение распространяется только на heredoc, содержащие внутри себя переменные.
Heredoc-текст ведет себя так же, как и строка в двойных кавычках, при этом их не имея. Это означает, что вам нет необходимости экранировать кавычки в heredoc, но вы по-прежнему можете использовать вышеперечисленные управляющие последовательности. Переменные обрабатываются, но с применением сложных переменных внутри heredoc нужно быть также внимательным, как и при работе со строками.
Пример #3 Пример определения 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; ?>
Результат выполнения данного примера:
Меня зовут «Имярек». Я печатаю Foo.
Теперь, я вывожу Bar2.
Это должно вывести заглавную букву ‘A’: A
Также возможно использовать heredoc-синтаксис для передачи данных через аргументы функции:
Пример #4 Пример применения heredoc в аргументах
<?php var_dump(array(<<<EOD foobar! EOD )); ?>
Начиная с версии 5.3.0, стала возможной инициализация статических переменных и свойств/констант класса с помощью синтаксиса heredoc:
Пример #5 Использование heredoc для инициализации статических переменных
<?php // Статические переменные function foo() { static $bar = <<<LABEL Здесь ничего нет... LABEL; } // Class properties/constants class foo { const BAR = <<<FOOBAR Пример использования константы FOOBAR; public $baz = <<<FOOBAR Пример использования поля FOOBAR; } ?>
Начиная с версии PHP 5.3.0 можно также окружать идентификатор Heredoc двойными кавычками:
Пример #6 Использование двойных кавычек в heredoc
<?php echo <<<"FOOBAR" Привет, мир! FOOBAR; ?>