Синтаксис PHP сводится к нескольким правилам. Код пишется между тегами <?php и ?>, каждая инструкция заканчивается точкой с запятой, имя переменной начинается со знака $. Имена переменных чувствительны к регистру, а имена функций нет. Остальное (условия, циклы, массивы, функции) похоже на C и JavaScript, поэтому после этих правил язык читается легко.
PHP выполняется на сервере, это один из основных языков бэкенд-разработки. Если вы ещё выбираете, стоит ли браться за PHP, сначала прочитайте, что это за язык и где его применяют. Здесь только синтаксис: каждый пример можно скопировать и запустить, под кодом стоит то, что он выводит.
Как запустить первый скрипт на PHP

Для примеров из статьи хватит PHP в командной строке. Сервер, база данных и готовая сборка вроде XAMPP понадобятся позже, когда дойдёте до сайтов.
- Скачайте PHP со страницы загрузок php.net или поставьте пакетным менеджером:
brew install phpна macOS,sudo apt install php-cliв Ubuntu. - Откройте терминал и наберите
php -v. Команда выведет номер установленной версии. Если терминал ответил «command not found», PHP не попал в переменную PATH. - Создайте файл
hello.phpв любом редакторе кода. Какой выбрать, разобрали в статье про редакторы для веб-разработки. - Вставьте в файл код ниже и запустите его командой
php hello.php.
<?php
echo "Привет, мир!\n";
Результат:
Привет, мир!
Чтобы открыть PHP-страницу в браузере, запустите в папке с файлами встроенный сервер: php -S localhost:8000, и зайдите на http://localhost:8000/hello.php. В руководстве PHP прямо сказано, что этот сервер нужен для разработки и не должен использоваться в общедоступных сетях.
Теги, точка с запятой и комментарии
PHP выполняет только то, что стоит между <?php и ?>. Всё снаружи уходит в браузер как есть, поэтому PHP можно вставлять прямо в HTML-разметку.
<?php $title="Курсы PHP"; ?>
<h1><?= $title ?></h1>
<p>2 + 2 = <?php echo 2 + 2; ?></p>
В браузер уйдёт уже готовый HTML:
<h1>Курсы PHP</h1>
<p>2 + 2 = 4</p>
Тег <?= делает то же, что <?php echo, только короче. Им выводят одну переменную внутри разметки. Как устроен сам HTML-файл, мы разбирали в инструкции о создании index.html.
Три правила, на которых новички ошибаются чаще всего:
| Правило | Как правильно | Что будет, если нарушить |
|---|---|---|
| Инструкция заканчивается точкой с запятой | $a = 5; |
Parse error, скрипт не запустится |
| В файле только с PHP-кодом закрывающий тег не ставят | Файл заканчивается последней инструкцией | Лишний пробел или перевод строки после ?> попадёт в вывод |
После <?php нужен пробел или перевод строки |
<?php echo 1; |
Синтаксическая ошибка |
Совет не закрывать тег в конце файла даёт само руководство PHP: так в вывод не попадут случайные пробелы и переводы строк. Обязательную точку с запятой описывает раздел о разделении инструкций.
Комментарии бывают трёх видов, и все три PHP пропускает при выполнении:
<?php
// однострочный комментарий
# тоже однострочный
/*
многострочный:
PHP его пропустит
*/
echo "Комментарии не выводятся\n";
Комментарии не выводятся
Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединитьсяПеременные и константы
Переменная в PHP начинается со знака доллара. Объявлять её заранее и указывать тип не нужно: она появляется в момент первого присваивания.
- имя начинается с латинской буквы или подчёркивания:
$name,$_count; - после первого символа можно ставить буквы, цифры и подчёркивания:
$user2,$total_price; - с цифры имя начинаться не может:
$2userвызовет ошибку; - регистр важен:
$nameи$Nameэто две разные переменные.
Полные правила именования описаны в справке PHP о переменных. Константа хранит значение, которое после объявления не меняется. Её задают функцией define() или словом const, знак доллара перед именем не ставят.
<?php
$name = "Анна";
$age = 28;
$Name = "Борис";
echo $name, "\n";
echo $Name, "\n";
ECHO "Возраст: $age\n";
define('SITE', 'checkroi.ru');
const MAX_USERS = 100;
echo SITE . " " . MAX_USERS . "\n";
Анна
Борис
Возраст: 28
checkroi.ru 100
Обратите внимание на строку с ECHO. Ключевые слова и имена функций PHP регистр не различает, поэтому echo, Echo и ECHO работают одинаково. Пишите всё же в нижнем регистре: так требует стандарт оформления кода PSR-12.
Типы данных

PHP сам определяет тип переменной по значению. Посмотреть тип помогает функция var_dump(): она печатает тип и само значение, поэтому при отладке её зовут чаще, чем echo.
<?php
var_dump(42);
var_dump(3.14);
var_dump("строка");
var_dump(true);
var_dump(null);
var_dump([1, 2]);
int(42)
float(3.14)
string(12) "строка"
bool(true)
NULL
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
В скобках у строки стоит 12, хотя букв шесть. var_dump() считает байты, а кириллическая буква в UTF-8 занимает два байта. Длину в символах даёт mb_strlen().
| Тип | Что хранит | Пример |
|---|---|---|
| int | целое число | 42, -7 |
| float | дробное число | 3.14, 1e3 |
| string | строка | "текст", 'текст' |
| bool | логическое значение | true, false |
| array | массив | [1, 2, 3] |
| null | отсутствие значения | null |
| object | объект класса | new DateTime() |
Полный список с callable и resource есть в описании типов. Новичку хватит семи из таблицы. Значение null означает «ничего нет», а не пустую строку и не ноль, так же как NULL в базах данных.
Сравнение == и ===
Двойное равно сравнивает значения и по дороге приводит типы. Тройное сравнивает ещё и тип. Разница видна на примерах:
<?php
var_dump(0 == "a");
var_dump("1" == "01");
var_dump("10" == "1e1");
var_dump(100 == "1e2");
var_dump("1" === "01");
var_dump(1 === 1.0);
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
Первая строка до PHP 8 возвращала true: число сравнивалось со строкой «a» как с нулём. В восьмой версии правило поменяли, это записано в списке изменений PHP 8.0.
Правило на каждый день: сравнивайте через
===, а==берите, только когда приведение типов вам нужно.
Строки: кавычки и склейка
Одинарные и двойные кавычки в PHP работают по-разному. В одинарных PHP выводит текст как есть. В двойных подставляет значения переменных и понимает \n как перевод строки.
<?php
$lang = "PHP";
echo 'Учу $lang\n';
echo "\n";
echo "Учу $lang\n";
echo "Учу {$lang}8\n";
echo "Учу " . $lang . " с нуля\n";
Учу $lang\n
Учу PHP
Учу PHP8
Учу PHP с нуля
Строки склеивают точкой. Плюс, которым склеивают строки в JavaScript, в PHP только складывает числа, и про это есть отдельный пункт в разделе с ошибками. Фигурные скобки {$lang} нужны, когда сразу за переменной идут буквы или цифры: без них PHP искал бы переменную $lang8. Подробно про виды кавычек и heredoc написано в главе о строках.
Операторы
Арифметика в PHP почти такая же, как на калькуляторе, но есть пара отличий от других языков. Деление / возвращает дробь, если числа не делятся нацело, даже когда оба целые. Целую часть даёт intdiv().
<?php
echo 7 / 2, "\n";
echo intdiv(7, 2), "\n";
echo 7 % 2, "\n";
echo 2 ** 10, "\n";
echo 5 <=> 3, "\n";
$user = null;
echo $user ?? "гость", "\n";
3.5
3
1
1024
1
гость| Оператор | Что делает | Пример и результат |
|---|---|---|
% |
остаток от деления | 7 % 2 → 1 |
** |
степень | 2 ** 10 → 1024 |
. |
склейка строк | "PHP" . "8" → PHP8 |
<=> |
сравнение «космический корабль»: −1, 0 или 1 | 5 <=> 3 → 1 |
?? |
значение по умолчанию, если слева null | $user ?? "гость" → гость |
&&, ||, ! |
логические И, ИЛИ, НЕ | true && false → false |
Остаток от дробных чисел считает функция fmod(), а знак остатка у % берётся от делимого: оба правила есть рядом с таблицей арифметических операторов. Логические && и тернарный оператор ? : показаны в следующем разделе.
Условия: if, switch и match
Конструкция if проверяет условие в круглых скобках и выполняет блок в фигурных. Ветка elseif пишется слитно, хотя PHP понимает и else if.
<?php
$score = 72;
if ($score >= 90) {
echo "Отлично\n";
} elseif ($score >= 60) {
echo "Зачёт\n";
} else {
echo "Пересдача\n";
}
$code = 404;
echo match ($code) {
200 => "OK",
301, 302 => "Редирект",
404 => "Не найдено",
default => "Другой код",
}, "\n";
Зачёт
Не найдено
match появился в PHP 8.0 и заменяет switch в большинстве задач. По описанию в руководстве, он сравнивает строго, через ===, и сам возвращает значение. Если ни одна ветка не подошла и нет default, PHP выбросит исключение UnhandledMatchError.
switch по-прежнему встречается в старом коде. В нём важно не забыть break, иначе выполнение провалится в следующий case:
<?php
$day = "сб";
switch ($day) {
case "сб":
case "вс":
echo "Выходной\n";
break;
default:
echo "Рабочий день\n";
}
Выходной
Короткую проверку можно записать в одну строку через тернарный оператор. Здесь же пример с логическим И и циклом do-while, у которого тело выполняется хотя бы раз:
<?php
$age = 20;
$hasTicket = true;
if ($age >= 18 && $hasTicket) {
echo "Проходите\n";
}
$status = $age >= 18 ? "взрослый" : "ребёнок";
echo $status, "\n";
$i = 10;
do {
echo "Выполнится один раз\n";
} while ($i < 5);
Проходите
взрослый
Выполнится один раз
Если вы уже писали на C, конструкции покажутся знакомыми: мы разбирали их в статье об управляющих конструкциях в C, синтаксис почти совпадает.
Циклы: for, while и foreach
Цикл повторяет блок кода, пока выполняется условие. Один такой повтор называется итерацией. В PHP чаще всего встречаются три вида циклов.
for: когда заранее известно число повторов;while: когда повторяем, пока условие верно, а сколько раз, неизвестно;foreach: когда нужно пройти по всем элементам массива.
<?php
for ($i = 1; $i <= 3; $i++) {
echo "Шаг $i\n";
}
$n = 3;
while ($n > 0) {
echo $n--, " ";
}
echo "\n";
$prices = ["курс" => 45000, "книга" => 1200];
foreach ($prices as $item => $price) {
echo "$item: $price ₽\n";
}
Шаг 1
Шаг 2
Шаг 3
3 2 1
курс: 45000 ₽
книга: 1200 ₽
В foreach запись $item => $price достаёт и ключ, и значение. Если ключ не нужен, пишут короче: foreach ($prices as $price). Как while ведёт себя в другом языке, можно сравнить по разбору цикла while в Python.
Массивы
Массив хранит несколько значений под одним именем. В PHP один тип array покрывает и обычные списки с номерами, и ассоциативные массивы с ключами-строками. Создают их квадратными скобками, старая запись array() тоже работает.
<?php
$langs = ["PHP", "JavaScript", "Python"];
$langs[] = "Go";
echo $langs[0], "\n";
echo count($langs), "\n";
$user = [
"name" => "Анна",
"role" => "backend",
];
print_r($user);
PHP
4
Array
(
[name] => Анна
[role] => backend
)
- нумерация начинается с нуля, поэтому первый элемент это
$langs[0]; - пустые скобки
$langs[] = "Go"добавляют элемент в конец; count()возвращает число элементов;print_r()печатает массив целиком, аechoтак не умеет.
Остальные способы работы с массивами собраны в справочнике по массивам.
Функции
Функция объявляется словом function. У аргументов и результата можно указать типы, а у аргумента задать значение по умолчанию. Строка declare(strict_types=1) в начале файла включает строгую проверку типов.
<?php
declare(strict_types=1);
function price(int $base, float $discount = 0.0): float
{
return $base * (1 - $discount);
}
echo price(40000), "\n";
echo price(40000, 0.15), "\n";
echo price("40000"), "\n";
40000
34000
PHP Fatal error: Uncaught TypeError: price(): Argument #1 ($base) must be of type int, string given, called in /tmp/project/index.php on line 11 and defined in /tmp/project/index.php:4
Stack trace:
#0 /tmp/project/index.php(11): price()
#1 {main}
thrown in /tmp/project/index.php on line 4
Первые два вызова отработали, а третий упал: функция ждёт число, а получила строку. Без strict_types PHP молча превратил бы «40000» в число. Строгий режим ловит такие ошибки раньше, поэтому в новых файлах его стоит включать сразу. Как он работает, описано в разделе об объявлении типов.
Ещё одна особенность из раздела о функциях: имя функции регистр не различает, в отличие от имени переменной.
<?php
function hello() { return "привет"; }
echo HELLO(), "\n";
привет
Частые ошибки новичка

Пять сообщений, которые чаще всего встречаются на первых неделях. Во всех примерах файл называется index.php.
Parse error: unexpected token
Симптом: скрипт не запускается вовсе, PHP указывает на строку.
<?php
$a = 5
echo $a;
PHP Parse error: syntax error, unexpected token "echo" in /tmp/project/index.php on line 3
Обычно причина в предыдущей строке: там не хватает точки с запятой или закрывающей скобки. Здесь ; потерялся после $a = 5, а PHP заметил это, только наткнувшись на echo.
Решение: смотрите на строку выше той, что в сообщении. Проверить синтаксис без запуска можно командой php -l index.php.
Warning: Undefined variable
<?php
echo $total + 1, "\n";
PHP Warning: Undefined variable $total in /tmp/project/index.php on line 2
1
Переменную используют до того, как ей что-то присвоили. Чаще всего это опечатка или разный регистр: объявили $Total, а читаете $total. Скрипт продолжит работу и подставит null, поэтому ошибку легко пропустить.
Решение: найдите место, где переменная должна получать значение, и сверьте имя буква в букву.
Array to string conversion
<?php
$list = [1, 2, 3];
echo $list, "\n";
PHP Warning: Array to string conversion in /tmp/project/index.php on line 3
Array
Массив пытаются вывести через echo. PHP печатает слово Array и предупреждение. Решение: для отладки берите print_r($list) или var_dump($list), а для вывода пользователю склейте элементы через implode(", ", $list).
Unsupported operand types: string + int
<?php
echo "5" + "3", "\n";
echo "Цена: " + 100, "\n";
8
PHP Fatal error: Uncaught TypeError: Unsupported operand types: string + int in /tmp/project/index.php:3
Stack trace:
#0 {main}
thrown in /tmp/project/index.php on line 3
Плюсом пытаются склеить строку с числом, как в JavaScript. Строки из цифр PHP сложит как числа, поэтому первая строка дала 8. Со строкой из букв PHP 8 падает с ошибкой.
Решение: склеивайте точкой, "Цена: " . 100.
Сравнение через == дало неожиданный true
Условие срабатывает там, где не должно. Например, "10" == "1e1" даёт true: обе строки похожи на числа, и PHP сравнивает их как числа. Такая ошибка не пишет сообщений, поэтому её ищут дольше остальных.
Решение: сравнивайте через ===, пример есть в разделе о типах выше.
Где освоить PHP системно
Синтаксис из этой статьи можно выучить за выходные. Дальше идут вещи, которые по статьям собирать долго: формы и запросы, базы данных, ООП, фреймворк Laravel и деплой. Для запросов к базе пригодится разбор команды SELECT в MySQL.
Если хотите учиться по плану, посмотрите советы, как учить PHP с нуля, и план на 12 месяцев для будущего PHP-разработчика. Сколько платят на выходе, разобрали в статье о зарплате PHP-разработчика.
Ниже курсы из нашего каталога, их можно сравнить по цене, длительности и формату. Все программы собраны на странице курсов PHP, а программы с трудоустройством на странице профессии PHP-разработчик.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Fullstack-разработчик на PHP» Перейти на сайт курса | 166 715 ₽ | 5378 ₽/мес. | 12 месяцев | Обзор курса | |
| PHP-разработчик с нуля до PRO Перейти на сайт курса | 114 961 ₽ | 4176 ₽/мес. | 7 месяцев | Обзор курса | |
| Backend-разработчик на PHP Перейти на сайт курса | 158 004 ₽ | 4389 ₽/мес. | 12 месяцев | Обзор курса | |
| PHP-разработчик Перейти на сайт курса | 69 000 ₽ | 3885 ₽/мес. | 10 месяцев | Обзор курса | |
| PHP-разработчик. Базовый уровень Перейти на сайт курса | 81 167 ₽ | 5227 ₽/мес. | 3 месяца | Обзор курса |
Больше программ — в полном каталоге курсов по php




