Перейти к основному содержимому

Синтаксис, операторы и пунктуация в PHP

Разработчику Архитектору

Знаки препинания, операторы и синтаксические символы в PHP

Обзор синтаксических элементов

Знаки препинания и специальные символы образуют основу синтаксиса PHP. Они определяют структуру кода, разделяют инструкции, объединяют данные и управляют выполнением программы. Понимание каждого символа позволяет писать чистый и предсказуемый код.

Точка с запятой

Точка с запятой завершает каждую исполняемую инструкцию в PHP. Этот символ сообщает интерпретатору о завершении текущей операции и готовности к следующей.

$name = "Maria";
$age = 28;
echo $name;
calculateTotal();

Пропуск точки с запятой вызывает синтаксическую ошибку. Исключение составляют последние инструкции в блоках кода, заключённых в фигурные скобки, где точка с запятой не обязательна, но рекомендуется для единообразия.


Запятая

Запятая разделяет элементы в списках: аргументы функций, значения массивов, параметры циклов, свойства объектов.

// Аргументы функции
function createUser($name, $email, $role) {
// тело функции
}

// Элементы массива
$colors = ["red", "green", "blue"];

// Параметры цикла foreach
foreach ($users as $user) {
// обработка
}

// Множественное присваивание через list()
list($first, $second, $third) = [1, 2, 3];

Запятая не выполняет вычислений, она служит разделителем синтаксических конструкций.


Точка

Точка выполняет конкатенацию строк. Оператор объединяет два строковых значения в одно.

$greeting = "Hello";
$name = "Alex";
$message = $greeting . ", " . $name . "!"; // Hello, Alex!

Точка работает с любыми типами данных, преобразуя их в строки при объединении. Числа, булевы значения и null автоматически приводятся к строковому представлению.

$result = "Score: " . 95;        // Score: 95
$status = "Active: " . true; // Active: 1
$empty = "Value: " . null; // Value:

Кавычки

Одинарные кавычки

Одинарные кавычки создают строковые литералы без интерпроляции переменных и без обработки большинства управляющих последовательностей.

$name = 'Peter';
$text = 'Hello, $name'; // Hello, $name
$escaped = 'It\'s a quote'; // It's a quote

Внутри одинарных кавычек обрабатываются только две последовательности: \\ для обратного слеша и \' для одинарной кавычки.


Двойные кавычки

Двойные кавычки поддерживают интерполяцию переменных и обработку управляющих последовательностей.

$name = "Peter";
$text = "Hello, $name"; // Hello, Peter

// Управляющие последовательности
$newline = "Line 1\nLine 2";
$tab = "Column 1\tColumn 2";
$path = "C:\\xampp\\htdocs";

Интерполяция работает с простыми переменными и массивами. Для сложных выражений используются фигурные скобки.

$user = ["name" => "Anna"];
echo "User: $user[name]"; // User: Anna
echo "Name: {$user['name']}"; // Name: Anna
echo "Next year: {$year + 1}"; // требуется фигурная скобка

Интерполяция переменной в строке:

"<текст> $<переменная> <текст>"
"<текст> {$<выражение>} <текст>"


Апостроф

Апостроф (') в типографском смысле отличается от одинарной кавычки по коду символа. В коде PHP используются только одинарные кавычки с кодом ASCII 39. Типографские апострофы (' или ) вызывают синтаксическую ошибку.

// Ошибка: используются типографские кавычки
// $text = 'It's wrong';

// Правильно: экранирование или двойные кавычки
$text = 'It\'s correct';
$text = "It's correct";

Скобки

Круглые скобки

Круглые скобки группируют выражения, определяют приоритет операций, ограничивают аргументы функций и условия в управляющих конструкциях.

// Группировка выражений
$result = (5 + 3) * 2; // 16

// Аргументы функции
calculate((int)$input);

// Условия
if ($age > 18 && ($status === 'active' || $status === 'premium')) {
// доступ разрешён
}

Вызов функции:

<функция>(<аргумент1>, <аргумент2>, ...);

Объявление функции:

function <имя>(<параметр1>, <параметр2>, ...) {
// тело функции
}

Объявление анонимной функции:

$<имя> = function(<параметры>) { /* тело */ };

Стрелочная функция:

$<имя> = fn(<параметр>) => <выражение>;

Объявление глобальной константы:

define("<ИМЯ>", <значение>);

Использование константы:

<ИМЯ> или constant("<ИМЯ>")


Квадратные скобки

Квадратные скобки обращаются к элементам массивов и строк по индексу, определяют литералы массивов.

// Доступ к элементу массива
$users[0] = "John";
echo $users[0];

// Доступ к символу строки
$word = "hello";
echo $word[1]; // e

// Литерал массива
$items = [10, 20, 30];
$assoc = ["key" => "value"];

Современный синтаксис использует квадратные скобки для всех операций с массивами. Старый синтаксис с array() остаётся поддерживаемым.

Объявление массива (индексированный):

$<имя> = [<элемент1>, <элемент2>, ...];

Объявление ассоциативного массива:

$<имя> = ["<ключ1>" => <значение1>, "<ключ2>" => <значение2>];

Доступ к элементу массива:

$<значение> = $<массив>[<индекс>];
$<значение> = $<массив>["<ключ>"];


Фигурные скобки

Фигурные скобки ограничивают блоки кода в функциях, классах, управляющих конструкциях. Они также используются для интерполяции сложных выражений внутри двойных кавычек.

// Блок кода функции
function process() {
$data = fetch();
return transform($data);
}

// Блок условия
if ($valid) {
save();
notify();
}

// Интерполяция сложного выражения
echo "Total: {$prices[0] * 1.2}";

Комментарии

Комментарии игнорируются интерпретатором и служат для пояснения кода разработчикам.

Однострочные комментарии

Два стиля однострочных комментариев: двойной слеш и символ решётки.

// Расчёт итоговой суммы
$subtotal = $price * $quantity;

# Устаревший стиль, редко используется
$tax = $subtotal * 0.2;

Комментарий продолжается до конца строки. Точка с запятой после комментария не требуется.

Однострочный комментарий:

// <комментарий>

Альтернативный однострочный комментарий:

# <комментарий>


Многострочные комментарии

Многострочные комментарии начинаются с /* и заканчиваются */. Они могут занимать несколько строк и встраиваться в середину выражений.

/*
* Функция обработки заказа
* Версия: 2.1
* Автор: Иван Петров
*/
function processOrder($orderId) {
/* временно отключено */ $notify = false;
return execute($orderId);
}

Вложенные многострочные комментарии недопустимы и вызывают ошибку синтаксического анализа.

Многострочный комментарий:

/*
<комментарий>
*/

Арифметические операторы

Арифметические операторы выполняют математические вычисления с числовыми значениями.

$a = 10;
$b = 3;

$sum = $a + $b; // 13 сложение
$diff = $a - $b; // 7 вычитание
$product = $a * $b; // 30 умножение
$quotient = $a / $b; // 3.333 деление
$mod = $a % $b; // 1 остаток от деления
$pow = $a ** $b; // 1000 возведение в степень

Оператор остатка % возвращает остаток после целочисленного деления. Для отрицательных чисел знак результата совпадает со знаком делимого.

Арифметические операции:

$<результат> = $<a> + $<b>;
$<результат> = $<a> - $<b>;
$<результат> = $<a> * $<b>;
$<результат> = $<a> / $<b>;
$<результат> = $<a> % $<b>;
$<результат> = $<a> ** $<b>;

Конкатенация строк:

$<результат> = $<строка1> . $<строка2>;


Операторы присваивания

Оператор присваивания = сохраняет значение справа в переменную слева. Составные операторы объединяют арифметическую операцию с присваиванием.

$x = 5;       // простое присваивание
$x += 3; // $x = $x + 3; результат: 8
$x -= 2; // $x = $x - 2; результат: 6
$x *= 4; // $x = $x * 4; результат: 24
$x /= 2; // $x = $x / 2; результат: 12
$x %= 5; // $x = $x % 5; результат: 2
$x **= 3; // $x = $x ** 3; результат: 8

Оператор присваивания возвращает присвоенное значение, что позволяет строить цепочки присваиваний.

$a = $b = $c = 10; // все три переменные равны 10

Составные операторы присваивания:

$<переменная> += <значение>;
$<переменная> -= <значение>;
$<переменная> *= <значение>;
$<переменная> /= <значение>;
$<переменная> %= <значение>;
$<переменная> **= <значение>;

Создание объекта:

$<объект> = new <Класс>(<аргументы>);

Объявление константы класса:

const <ИМЯ> = <значение>;


Операторы сравнения

Операторы сравнения проверяют отношения между значениями и возвращают булев результат.

$a = 5;
$b = "5";

$a == $b; // true равенство с приведением типов
$a === $b; // false строгое равенство без приведения
$a != $b; // false неравенство с приведением
$a !== $b; // true строгое неравенство
$a < $b; // false меньше
$a > $b; // false больше
$a <= $b; // true меньше или равно
$a >= $b; // true больше или равно

Строгие операторы === и !== проверяют совпадение как значения, так и типа данных. Использование строгих сравнений предотвращает неочевидные ошибки, связанные с автоматическим приведением типов.

Сравнения:

$<результат> = $<a> == $<b>;
$<результат> = $<a> === $<b>;
$<результат> = $<a> != $<b>;
$<результат> = $<a> !== $<b>;
$<результат> = $<a> < $<b>;
$<результат> = $<a> <= $<b>;
$<результат> = $<a> > $<b>;
$<результат> = $<a> >= $<b>;


Логические операторы

Логические операторы объединяют булевы выражения.

$valid = true;
$active = false;

$valid && $active; // false логическое И
$valid || $active; // true логическое ИЛИ
!$valid; // false логическое НЕ

$valid and $active; // false альтернативный синтаксис И
$valid or $active; // true альтернативный синтаксис ИЛИ

Операторы && и || имеют более высокий приоритет, чем and и or. Смешивание этих стилей в одном выражении может привести к неожиданному порядку вычислений.

Логические операции:

$<результат> = $<a> && $<b>;
$<результат> = $<a> || $<b>;
$<результат> = !$<a>;
$<результат> = $<a> and $<b>;
$<результат> = $<a> or $<b>;


Специальные операторы и символы

Доллар

Символ доллара $ предшествует имени каждой переменной в PHP. Он отличает переменные от ключевых слов и литералов.

$name = "Tom";
$age = 30;
$is_active = true;

Константы и имена функций, классов, методов используются без символа доллара.

Пример - объявление переменной:

$<имя> = <значение>;

Присваивание с преобразованием типа:

$<имя> = (<тип>) <выражение>;


Стрелка

Двойная стрелка -> обращается к свойствам и методам объектов.

$user = new User();
$user->name = "Elena";
$user->save();
echo $user->getName();

Стрелка применяется только к экземплярам классов. Для статических членов класса используется двойное двоеточие ::.

Обращение к свойству объекта:

$<объект>-><свойство>

Вызов метода объекта:

$<объект>-><метод>(<аргументы>);


Двойное двоеточие

Двойное двоеточие :: обращается к статическим свойствам, методам и константам класса.

class Config {
const MAX_SIZE = 1024;
public static $timeout = 30;
public static function getDefault() {
return self::MAX_SIZE;
}
}

echo Config::MAX_SIZE; // 1024
echo Config::$timeout; // 30
echo Config::getDefault(); // 1024

Внутри класса для обращения к собственным статическим членам используются ключевые слова self, static или parent.

Обращение к статическому свойству:

<Класс>::$<свойство>

Вызов статического метода:

<Класс>::<метод>(<аргументы>);


Стрелка-функция

Стрелка-функция fn() определяет короткие анонимные функции с неявным возвратом.

$square = fn($x) => $x * $x;
echo $square(5); // 25

$users = ["alice", "bob", "charlie"];
$upper = array_map(fn($name) => strtoupper($name), $users);
// ["ALICE", "BOB", "CHARLIE"]

Стрелочные функции автоматически захватывают переменные из окружающей области видимости без необходимости использования use.


Тернарный оператор

Тернарный оператор ? : выбирает значение на основе условия.

$<результат> = <условие> ? <значение_если_истина> : <значение_если_ложь>;

$age = 20;
$status = $age >= 18 ? "adult" : "minor";

// Сокращённая форма (оператор Элвиса)
$username = $_GET['user'] ?? "guest";

Оператор Элвиса ?: возвращает левый операнд, если он приводится к истине, иначе правый операнд. Оператор нулевого слияния ?? возвращает левый операнд, если он не равен null, иначе правый операнд.

Оператор нулевого слияния:

$<результат> = $<переменная> ?? <значение_по_умолчанию>;

Оператор Элвиса:

$<результат> = $<переменная> ?: <значение_по_умолчанию>;


Match-выражение

Конструкция match сопоставляет значение с несколькими вариантами и возвращает результат.

$statusCode = 404;
$message = match($statusCode) {
200, 201 => "Success",
400 => "Bad request",
404 => "Not found",
500 => "Server error",
default => "Unknown status"
};

Match возвращает значение, которое можно присвоить переменной или использовать в выражении. Все ветви должны возвращать совместимые типы.

Match-выражение:

$<результат> = match(<выражение>) {
<значение1>, <значение2> => <результат1>,
<значение3> => <результат2>,
default => <результат_по_умолчанию>
};

Условный оператор (if)

if (<условие>) {
// действия при истине
} elseif (<условие>) {
// действия при втором условии
} else {
// действия при лжи
}

Приоритет операторов

Приоритет операторов определяет порядок вычисления выражений. Операторы с высоким приоритетом вычисляются раньше операторов с низким приоритетом.

$result = 2 + 3 * 4;   // 14, умножение выполняется раньше сложения
$result = (2 + 3) * 4; // 20, скобки изменяют порядок

При одинаковом приоритете операторы вычисляются согласно ассоциативности: слева направо или справа налево. Например, оператор присваивания ассоциативен справа налево, а арифметические операторы — слева направо.

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