Главный секрет PHP заключается в том, что сам язык — шаблонизатор. Если вы посмотрите любой другой язык, то в его файлах не увидите ничего похожего на теги: <?php ... ?>. В PHP любой файл с кодом это шаблон, причём этот шаблон не имеет никакой структуры (как бывает в некоторых шаблонизаторах). Вы можете создать PHP-файл, написать любой текст вне тегов <?php ?>, запустить код на выполнение и, внезапно, он не упадёт с указанием синтаксической ошибки.

Содержимое index.php:

hi
i am
the template

Запуск этого "кода" выведет весь текст на экран:

$ php index.php
hi
i am
the template

То же самое касается HTML, так как это всего лишь текст. Достаточно в любом PHP-файле добавить немного HTML и запустить его, как он будет выведен на экран:

Содержимое index.php:

<div>
  <a href="/lessons">Lessons</a>
</div>

Запуск этого "кода" выведет весь текст на экран:

$ php index.php
<div>
  <a href="/lessons">Lessons</a>
</div>

Такое поведение языка существует исключительно ради создания сайтов. Если запустить веб-сервер в директории с этим файлом index.php, то при обращении к этому "сайту", мы получим ровно тот же вывод что и в терминале. А это значит, что мы можем заменить такой код:

<?php

echo '<p>hello, world</p>';

На такой:

<p>hello, world</p>

Отсюда следует очень важный вывод. Любой PHP файл, на самом деле – обычный текстовый файл со вставками PHP кода (с помощью тегов <?php ?>). Любой текст написанный внутри него, отдается в вывод как есть, будь то браузер или запуск в командной строке.

Теперь добавим немного PHP. Шаблон становится шаблоном, тогда, когда внутри него появляется подстановка данных. Принцип работы такой, абсолютно в любом месте шаблона вставляются теги <?php ?> внутри которых можно написать код. Фактически мы имеем дело с обычной строковой интерполяцией:

<div>
  <a href="/lessons"><?php echo 'Lessons' ?></a>
</div>

Добавим немного программирования. Запуск следующего кода, вернёт такой же результат что и код выше:

<?php
$name = 'Lessons';
?>

<div>
  <a href="/lessons"><?php echo $name ?></a>
</div>

В данном примере я добавил один блок сверху файла, внутри которого создал переменную. Затем, использовал её в другой вставке. Все содержимое файла находится в одном пространстве и блоки кода определённые дальше по тексту имеют доступ к данным предыдущих блоков. Что важно, подстановка данных из кода происходит только в том случае, если этот код выполняет печать.

<?php
$name = 'Lessons';
$id = 23;
?>

<div>
  <a href="/lessons/<?php echo $id ?>"><?php echo $name ?></a>
</div>

Вывод на экран после запуска:

$ php index.php
<div>
  <a href="/lessons/23">Lessons</a>
</div>

Для удобства вставки кода в HTML, PHP предлагает альтернативный синтаксис для стандартных конструкций языка. Например, для вставки значения используется сокращённая версия тега начала PHP-кода: <?= <код на php> ?>, она отличается от полной тем что вместо <?php echo ... используется <?= ....

Сокращённая вставка

<?php
$name = 'Lessons';
?>

<div>
  <a href="/lessons/<?= 23 ?>"><?= $name ?></a>
</div>

If

<?php if ($a == 5) : ?>
  A is equal to 5
<?php endif; ?>

Switch

<?php switch ($foo) : ?>
    <?php case 1: ?>
    ...
<?php endswitch ?>

Foreach

<ul>
    <?php foreach ($users as $user) : ?>
        <li><?= $user->getName() ?></li>
    <?php endforeach; ?>
</ul>

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

<!DOCTYPE html>
<html>
<head>
  <title>Upload your files</title>
</head>
<body>
  <form enctype="multipart/form-data" action="upload.php" method="POST">
    <p>Upload your file</p>
    <input type="file" name="uploaded_file"></input><br />
    <input type="submit" value="Upload"></input>
  </form>
</body>
</html>

<?php
  if (!empty($_FILES['uploaded_file'])) {
    $path = "uploads/";
    $path = $path . basename( $_FILES['uploaded_file']['name']);
    if (move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $path)) {
        echo "The file " .  basename( $_FILES['uploaded_file']['name']) . " has been uploaded";
    } else{
        echo "There was an error uploading the file, please try again!";
    }
  }

Такой способ программирования возможен только в PHP (потому что только PHP это сразу и язык и шаблонизатор и CGI-скрипт). При таком способе организации кода, сайт очень быстро начинает представлять из себя мешанину HTML и PHP. Если количество разных страниц сайта достигнет хотя бы десятка (а их обычно сотни и больше), то поддержка уже станет невероятно сложной. Безопасность такой шаблонизации находится на нуле (см. XSS). Также PHP не поддерживает макеты, то есть специализированные шаблоны, содержащие обвязку сайта, в которую вставляется HTML конкретного обработчика.

По этой причине в PHP, как и в других языках, используют шаблонизаторы, написанные на самом PHP. Наиболее популярные среди них Blade и Twig. Лично мне больше импонируют шаблоны на основе Slim, но в PHP они не так популярны, как в JS или Ruby. Шаблонизаторы будут одной из тем следующих уроков.

Самостоятельная работа

  1. Добавьте в index.php заголовок <h1>hello, php!</h1> вне PHP кода.
  2. Добавьте в index.php заголовок <h1>i am from PHP!</h1> внутри PHP кода через echo.

Дополнительные материалы

  1. Альтернативный синтаксис управляющих конструкций
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →