Синтаксис PHP: основы языка с примерами кода

Код PHP пишется между PHP-тегами, каждая инструкция заканчивается точкой с запятой, а имя переменной начинается со знака доллара.

Разбираем синтаксис на примерах: типы данных, строки, операторы, условия, циклы, массивы и функции.

Под каждым примером стоит его вывод, а в конце пять ошибок, которые чаще всего встречаются у новичков.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3202 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3856 экспертных мнений Подписаться на Телеграм-канал
Обложка: Синтаксис PHP: основы языка с примерами кода

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

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

CheckroiCheckroiПодборка курсов по php39 курсов • 17 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Как запустить первый скрипт на PHP

Рой запускает первый PHP-скрипт в терминале

Для примеров из статьи хватит PHP в командной строке. Сервер, база данных и готовая сборка вроде XAMPP понадобятся позже, когда дойдёте до сайтов.

  1. Скачайте PHP со страницы загрузок php.net или поставьте пакетным менеджером: brew install php на macOS, sudo apt install php-cli в Ubuntu.
  2. Откройте терминал и наберите php -v. Команда выведет номер установленной версии. Если терминал ответил «command not found», PHP не попал в переменную PATH.
  3. Создайте файл hello.php в любом редакторе кода. Какой выбрать, разобрали в статье про редакторы для веб-разработки.
  4. Вставьте в файл код ниже и запустите его командой 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(), а знак остатка у % берётся от делимого: оба правила есть рядом с таблицей арифметических операторов. Логические && и тернарный оператор ? : показаны в следующем разделе.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Условия: 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»
Перейти на сайт курса
SkillboxSkillbox166 715 ₽5378 ₽/мес.12 месяцевОбзор курса
PHP-разработчик с нуля до PRO
Перейти на сайт курса
SkillboxSkillbox114 961 ₽4176 ₽/мес.7 месяцевОбзор курса
Backend-разработчик на PHP
Перейти на сайт курса
SkillFactorySkillFactory158 004 ₽4389 ₽/мес.12 месяцевОбзор курса
PHP-разработчик
Перейти на сайт курса
HexletHexlet69 000 ₽3885 ₽/мес.10 месяцевОбзор курса
PHP-разработчик. Базовый уровень
Перейти на сайт курса
SkillboxSkillbox81 167 ₽5227 ₽/мес.3 месяцаОбзор курса

Больше программ — в полном каталоге курсов по php

Часто задаваемые вопросы

Что означает знак $ в PHP?

Знаком доллара начинается имя любой переменной: $name, $total. У констант и функций знака доллара нет. Имя переменной чувствительно к регистру, поэтому $name и $Name это разные переменные.

Чем одинарные кавычки отличаются от двойных?

В одинарных кавычках PHP выводит текст как есть: переменные не подставляются, а \n остаётся двумя символами. В двойных кавычках PHP подставляет значения переменных и понимает \n как перевод строки.

Как написать комментарий в PHP?

Однострочный комментарий начинается с // или #, многострочный пишется между /* и */. PHP пропускает комментарии при выполнении, в вывод они не попадают.

Нужно ли ставить закрывающий тег ?> в конце файла?

В файле, где только PHP-код, закрывающий тег лучше не ставить. Так советует руководство PHP: без него в вывод не попадут случайные пробелы и переводы строк после тега.

Чем == отличается от === в PHP?

Двойное равно сравнивает значения и приводит типы, поэтому "10" == "1e1" даёт true. Тройное равно проверяет ещё и тип: "1" === "01" даёт false. Если приведение типов не нужно, сравнивайте через ===.

Как объявить константу в PHP?

Функцией define('SITE', 'checkroi.ru') или словом const: const MAX_USERS = 100. Знак доллара перед именем константы не ставят, а изменить её после объявления нельзя.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!