Главный секрет 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.
Шаблонизаторы будут одной из тем следующих уроков.
Самостоятельная работа
- Добавьте в index.php заголовок
<h1>hello, php!</h1>
вне PHP-кода. - Добавьте в index.php заголовок
<h1>i am from PHP!</h1>
внутри PHP-кода черезecho
.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.