Глава 1.1: Синтаксис PHP
Переменные, типы данных, операторы, как PHP выполняет код
Как PHP выполняет код?
Прежде чем писать код, давай поймём, что с ним происходит.
Жизненный цикл PHP-скрипта
┌─────────────────────────────────────────────────────────────────┐
│ КАК PHP ВЫПОЛНЯЕТ КОД │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. ЗАПРОС │
│ Браузер → GET /index.php → Веб-сервер │
│ │ │
│ ▼ │
│ 2. ЧТЕНИЕ │
│ PHP читает файл index.php в память │
│ │ │
│ ▼ │
│ 3. ПАРСИНГ (Лексический анализ) │
│ Код превращается в токены: │
│ "<?php $x = 5;" → [T_OPEN_TAG, T_VARIABLE, '=', T_NUM...] │
│ │ │
│ ▼ │
│ 4. КОМПИЛЯЦИЯ │
│ Токены → байткод (опкоды) │
│ │ │
│ ▼ │
│ 5. ВЫПОЛНЕНИЕ │
│ Zend Engine выполняет байткод │
│ Переменные создаются, функции вызываются │
│ │ │
│ ▼ │
│ 6. ВЫВОД │
│ Результат (HTML/JSON/текст) → браузеру │
│ │ │
│ ▼ │
│ 7. ЗАВЕРШЕНИЕ │
│ Память очищается, скрипт умирает │
│ Следующий запрос — всё сначала! │
│ │
└─────────────────────────────────────────────────────────────────┘Ключевой момент: PHP умирает после каждого запроса
Это важно понять: PHP не помнит ничего между запросами.
<?php
$counter = $counter + 1; // $counter не существует от предыдущего запроса!
echo $counter; // Всегда будет 1 (или ошибка)Каждый HTTP-запрос — это новая жизнь скрипта. Переменные, объекты, всё создаётся заново и уничтожается в конце.
Чтобы сохранять данные между запросами, используют:
- Сессии (память на сервере)
- Куки (память в браузере)
- Базу данных (постоянное хранилище)
- Файлы
1. Переменные
Что такое переменная?
Переменная — это именованный контейнер для хранения данных.
<?php
$name = "Иван"; // Переменная $name хранит строку "Иван"
$age = 25; // Переменная $age хранит число 25
$price = 99.99; // Переменная $price хранит дробное числоПредставь переменную как коробку с наклейкой:
- Наклейка — это имя переменной (
$name) - Содержимое коробки — это значение (
"Иван")
Синтаксис переменных
<?php
$variableName = value;
│ │ │
│ │ └── Значение (что хранить)
│ │
│ └── Имя переменной (начинается с буквы или _)
│
└── Знак доллара (обязателен!)Правила именования
<?php
// ✅ Правильно
$name = "Иван";
$userName = "ivan";
$user_name = "ivan";
$_private = "secret";
$name2 = "Пётр";
// ❌ Неправильно
$2name = "ошибка"; // Нельзя начинать с цифры
$user-name = "ошибка"; // Нельзя использовать дефис
$user name = "ошибка"; // Нельзя использовать пробел
name = "ошибка"; // Забыт знак $Регистрозависимость
Имена переменных чувствительны к регистру:
<?php
$name = "Иван";
$Name = "Пётр";
$NAME = "Сидор";
echo $name; // Иван
echo $Name; // Пётр
echo $NAME; // Сидор
// Это ТРИ РАЗНЫЕ переменные!Соглашения об именовании
<?php
// camelCase — рекомендуется для переменных и функций
$userName = "ivan";
$totalPrice = 100;
$isActive = true;
// snake_case — тоже часто используется
$user_name = "ivan";
$total_price = 100;
$is_active = true;
// UPPER_CASE — для констант (узнаем позже)
define('MAX_SIZE', 100);
const DATABASE_NAME = 'mydb';Совет: Выбери один стиль и придерживайся его во всём проекте. В Laravel принято использовать camelCase для переменных.
Присваивание значений
<?php
// Простое присваивание
$x = 5;
// Можно присваивать результат выражения
$y = $x + 10; // $y = 15
// Можно присваивать результат функции
$length = strlen("Hello"); // $length = 5
// Можно переприсваивать
$x = 5;
$x = 10; // Теперь $x = 10
$x = "текст"; // Теперь $x = "текст" (тип изменился!)Переменные переменных (Variable Variables)
Экзотика, но полезно знать:
<?php
$varName = "age";
$$varName = 25; // Создаёт переменную $age = 25
echo $age; // 25
echo $$varName; // 25
echo ${$varName}; // 25 (более явный синтаксис)2. Типы данных
PHP — динамически типизированный язык. Это значит:
- Не нужно объявлять тип переменной
- Тип определяется автоматически по значению
- Тип может меняться во время выполнения
Скалярные типы (простые)
String (Строка)
<?php
// Одинарные кавычки — буквальная строка
$str1 = 'Привет, мир!';
$str2 = 'Он сказал: "Привет"';
$str3 = 'It\'s a string'; // Экранирование апострофа
// Двойные кавычки — интерполяция переменных
$name = "Иван";
$str4 = "Привет, $name!"; // Привет, Иван!
$str5 = "Привет, {$name}!"; // Привет, Иван! (явный синтаксис)
$str6 = "Имя: {$user['name']}"; // Для массивов нужны {}
// Специальные символы (только в двойных кавычках!)
$str7 = "Первая строка\nВторая строка"; // \n = новая строка
$str8 = "Табуляция:\tтекст"; // \t = табуляция
$str9 = "Путь: C:\\folder\\file"; // \\ = обратный слэш
// Heredoc — многострочные строки с интерполяцией
$html = <<<HTML
<div class="card">
<h1>$name</h1>
<p>Добро пожаловать!</p>
</div>
HTML;
// Nowdoc — многострочные строки БЕЗ интерполяции
$code = <<<'CODE'
<?php
$x = 5;
echo $x; // $x НЕ будет заменён на значение
CODE;Когда что использовать:
'одинарные'— когда не нужна интерполяция (чуть быстрее)"двойные"— когда нужны переменные внутри строкиheredoc— для большого HTML/текста с переменнымиnowdoc— для кода или текста, где$должен остаться как есть
Integer (Целое число)
<?php
$int1 = 42; // Обычное число
$int2 = -17; // Отрицательное
$int3 = 0; // Ноль
// Разные системы счисления
$decimal = 255; // Десятичная
$hex = 0xFF; // Шестнадцатеричная (= 255)
$octal = 0377; // Восьмеричная (= 255)
$binary = 0b11111111; // Двоичная (= 255)
// Разделитель для читаемости (PHP 7.4+)
$million = 1_000_000; // = 1000000
$bytes = 0xCAFE_BABE; // = 0xCAFEBABE
// Максимальное значение
echo PHP_INT_MAX; // 9223372036854775807 (на 64-bit)
echo PHP_INT_MIN; // -9223372036854775808Float (Дробное число)
<?php
$float1 = 3.14;
$float2 = -0.5;
$float3 = 2.5e3; // 2.5 × 10³ = 2500
$float4 = 1.2e-3; // 1.2 × 10⁻³ = 0.0012
// ОСТОРОЖНО с точностью!
$a = 0.1 + 0.2;
echo $a; // 0.30000000000000004 (!!)
echo $a == 0.3; // false (!!)
// Правильное сравнение float
$epsilon = 0.00001;
echo abs($a - 0.3) < $epsilon; // true⚠️ Важно: Дробные числа неточны из-за особенностей хранения в памяти. Никогда не сравнивай float через ==. Для денег используй целые числа (копейки/центы) или специальные библиотеки.
Boolean (Логический)
<?php
$isActive = true;
$isDeleted = false;
// Что преобразуется в false:
$falsy1 = false;
$falsy2 = 0;
$falsy3 = 0.0;
$falsy4 = ""; // Пустая строка
$falsy5 = "0"; // Строка "0" (!)
$falsy6 = []; // Пустой массив
$falsy7 = null;
// Всё остальное — true:
$truthy1 = true;
$truthy2 = 1;
$truthy3 = -1; // Любое число кроме 0
$truthy4 = "false"; // Строка "false" — это true!
$truthy5 = [0]; // Непустой массив — trueСоставные типы
Array (Массив)
<?php
// Индексированный массив (с числовыми ключами)
$fruits = ["яблоко", "банан", "апельсин"];
echo $fruits[0]; // яблоко
echo $fruits[1]; // банан
echo $fruits[2]; // апельсин
// Ассоциативный массив (с строковыми ключами)
$user = [
"name" => "Иван",
"age" => 25,
"email" => "ivan@example.com"
];
echo $user["name"]; // Иван
echo $user["age"]; // 25
// Смешанный
$mixed = [
0 => "первый",
"key" => "значение",
1 => "второй"
];
// Многомерный массив
$users = [
[
"name" => "Иван",
"age" => 25
],
[
"name" => "Мария",
"age" => 30
]
];
echo $users[0]["name"]; // Иван
echo $users[1]["age"]; // 30
// Добавление элементов
$fruits[] = "киви"; // Добавит с индексом 3
$user["phone"] = "123-456"; // Добавит новый ключМассивы подробно разберём в отдельной главе.
Object (Объект)
<?php
// Создание объекта из класса
class User {
public $name;
public $age;
}
$user = new User();
$user->name = "Иван";
$user->age = 25;
echo $user->name; // Иван
// Объект из stdClass
$obj = new stdClass();
$obj->title = "Заголовок";
$obj->content = "Контент";
// Приведение массива к объекту
$array = ["name" => "Иван", "age" => 25];
$obj = (object) $array;
echo $obj->name; // ИванОбъекты подробно разберём в главах про ООП.
Специальные типы
NULL
<?php
$var = null; // Переменная существует, но не имеет значения
// Проверка на null
if ($var === null) {
echo "Переменная равна null";
}
// is_null() — то же самое
if (is_null($var)) {
echo "Это null";
}
// isset() — проверяет, существует ли и НЕ null
$a = null;
$b = "value";
var_dump(isset($a)); // false (существует, но null)
var_dump(isset($b)); // true
var_dump(isset($c)); // false (не существует)Resource (Ресурс)
<?php
// Ресурс — это ссылка на внешний ресурс
$file = fopen("file.txt", "r"); // Ресурс файла
$db = mysqli_connect("localhost", "user", "pass"); // Ресурс соединения
// Ресурсы нужно закрывать!
fclose($file);
mysqli_close($db);Определение типа
<?php
$var = "Hello";
// gettype() — возвращает тип как строку
echo gettype($var); // string
// Функции is_*
var_dump(is_string($var)); // true
var_dump(is_int($var)); // false
var_dump(is_array($var)); // false
var_dump(is_bool($var)); // false
var_dump(is_null($var)); // false
var_dump(is_numeric($var)); // false
var_dump(is_numeric("123")); // true (!)
// var_dump() — показывает тип и значение (для отладки)
var_dump($var); // string(5) "Hello"
// print_r() — для массивов и объектов
$arr = [1, 2, 3];
print_r($arr);
// Array ( [0] => 1 [1] => 2 [2] => 3 )3. Приведение типов (Type Casting)
Автоматическое приведение (Type Juggling)
PHP автоматически преобразует типы в зависимости от контекста:
<?php
// Строка + число
$result = "5" + 3;
echo $result; // 8 (int) — строка "5" стала числом
// Строка с числом в начале
$result = "10 apples" + 5;
echo $result; // 15 — взялось число из начала строки
// Строка без числа в начале
$result = "apples" + 5;
echo $result; // 5 — "apples" стало 0
// В условиях
if ("hello") {
echo "truthy"; // Выполнится, т.к. непустая строка = true
}
// Конкатенация
$str = "Возраст: " . 25;
echo $str; // "Возраст: 25" — число стало строкойЯвное приведение (Type Casting)
<?php
$var = "123";
// Способ 1: (type)
$int = (int) $var; // 123
$float = (float) $var; // 123.0
$string = (string) 123; // "123"
$bool = (bool) $var; // true
$array = (array) $var; // ["123"]
// Способ 2: функции
$int = intval($var); // 123
$float = floatval($var); // 123.0
$string = strval(123); // "123"
// Примеры преобразований
echo (int) "42abc"; // 42
echo (int) "abc42"; // 0
echo (int) true; // 1
echo (int) false; // 0
echo (int) null; // 0
echo (int) 3.9; // 3 (отбрасывается дробная часть)
echo (string) true; // "1"
echo (string) false; // "" (пустая строка)
echo (string) null; // "" (пустая строка)
echo (bool) 0; // false
echo (bool) 1; // true
echo (bool) ""; // false
echo (bool) "0"; // false (!)
echo (bool) "false"; // true (!!)Type Declarations (PHP 7+)
В современном PHP можно указывать типы:
<?php
// Типы параметров функции
function greet(string $name): string {
return "Привет, $name!";
}
echo greet("Иван"); // Привет, Иван!
echo greet(123); // Привет, 123! (автоприведение)
// Строгий режим
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
echo add(5, 3); // 8
echo add("5", "3"); // TypeError! (в строгом режиме)4. Операторы
Арифметические операторы
<?php
$a = 10;
$b = 3;
echo $a + $b; // 13 Сложение
echo $a - $b; // 7 Вычитание
echo $a * $b; // 30 Умножение
echo $a / $b; // 3.333... Деление
echo $a % $b; // 1 Остаток от деления (модуль)
echo $a ** $b; // 1000 Возведение в степень (PHP 5.6+)
// Унарные операторы
echo -$a; // -10 Отрицание
echo +$a; // 10 Преобразование к числуОператоры присваивания
<?php
$a = 10; // Простое присваивание
// Комбинированные операторы
$a += 5; // $a = $a + 5; → 15
$a -= 3; // $a = $a - 3; → 12
$a *= 2; // $a = $a * 2; → 24
$a /= 4; // $a = $a / 4; → 6
$a %= 4; // $a = $a % 4; → 2
$a **= 3; // $a = $a ** 3; → 8
// Для строк
$str = "Hello";
$str .= " World"; // "Hello World"
// Присваивание по ссылке
$a = 5;
$b = &$a; // $b теперь ссылается на ту же память, что и $a
$a = 10;
echo $b; // 10 (изменилось вместе с $a!)Операторы сравнения
<?php
$a = 5;
$b = "5";
$c = 10;
// Нестрогое сравнение (с приведением типов)
var_dump($a == $b); // true (5 == "5")
var_dump($a != $c); // true (5 != 10)
var_dump($a <> $c); // true (то же, что !=)
var_dump($a < $c); // true (5 < 10)
var_dump($a > $c); // false (5 > 10)
var_dump($a <= 5); // true (5 <= 5)
var_dump($a >= 5); // true (5 >= 5)
// Строгое сравнение (без приведения типов)
var_dump($a === $b); // false (int !== string)
var_dump($a !== $b); // true
// Spaceship operator (PHP 7+)
echo 1 <=> 2; // -1 (меньше)
echo 2 <=> 2; // 0 (равно)
echo 3 <=> 2; // 1 (больше)Таблица сравнений (важно!)
┌────────────────────────────────────────────────────────────────┐
│ НЕСТРОГОЕ СРАВНЕНИЕ (==) │
├──────────┬───────┬───────┬───────┬───────┬───────┬────────────┤
│ │ true │ false │ 1 │ 0 │ "1" │ "" │
├──────────┼───────┼───────┼───────┼───────┼───────┼────────────┤
│ true │ true │ false │ true │ false │ true │ false │
│ false │ false │ true │ false │ true │ false │ true │
│ 1 │ true │ false │ true │ false │ true │ false │
│ 0 │ false │ true │ false │ true │ false │ true (!) │
│ "1" │ true │ false │ true │ false │ true │ false │
│ "" │ false │ true │ false │ true │ false │ true │
│ "0" │ false │ true │ false │ true │ false │ false │
│ null │ false │ true │ false │ true │ false │ true │
└──────────┴───────┴───────┴───────┴───────┴───────┴────────────┘
Вот почему важно использовать === вместо ==!
0 == "" → true (оба falsy)
0 == "0" → true (приведение)
"" == "0" → false (!)
0 === "" → false (разные типы)Правило: Всегда используй === и !==, если нет веской причины использовать ==.
Логические операторы
<?php
$a = true;
$b = false;
// AND (и) — оба должны быть true
var_dump($a && $b); // false
var_dump($a and $b); // false (то же, но ниже приоритет)
// OR (или) — хотя бы один true
var_dump($a || $b); // true
var_dump($a or $b); // true (то же, но ниже приоритет)
// XOR (исключающее или) — ровно один true
var_dump($a xor $b); // true
var_dump($a xor $a); // false
// NOT (не) — инверсия
var_dump(!$a); // false
var_dump(!$b); // trueКороткое замыкание (Short-circuit)
<?php
// AND: если первое false — второе не проверяется
$result = false && someExpensiveFunction(); // Функция НЕ вызовется
// OR: если первое true — второе не проверяется
$result = true || someExpensiveFunction(); // Функция НЕ вызовется
// Практическое применение
$user = getUser() && $user->isActive(); // Безопасно, если getUser() вернёт null
// Значение по умолчанию
$name = $inputName || "Гость"; // ❌ Не работает как ожидается!
$name = $inputName ?: "Гость"; // ✅ Тернарный оператор
$name = $inputName ?? "Гость"; // ✅ Null coalescing (PHP 7+)Строковые операторы
<?php
// Конкатенация (объединение строк)
$first = "Hello";
$second = "World";
$result = $first . " " . $second; // "Hello World"
// Конкатенация с присваиванием
$str = "Hello";
$str .= " World"; // "Hello World"
// Интерполяция (в двойных кавычках)
$name = "Иван";
echo "Привет, $name!"; // Привет, Иван!Операторы инкремента/декремента
<?php
$a = 5;
// Постинкремент — вернёт значение, ПОТОМ увеличит
echo $a++; // 5
echo $a; // 6
// Преинкремент — СНАЧАЛА увеличит, потом вернёт
$a = 5;
echo ++$a; // 6
echo $a; // 6
// Постдекремент
$a = 5;
echo $a--; // 5
echo $a; // 4
// Предекремент
$a = 5;
echo --$a; // 4
echo $a; // 4
// Практика: цикл
for ($i = 0; $i < 5; $i++) {
echo $i; // 0, 1, 2, 3, 4
}Тернарный оператор
<?php
// Полная форма
$age = 18;
$status = ($age >= 18) ? "взрослый" : "ребёнок";
echo $status; // взрослый
// Это эквивалентно:
if ($age >= 18) {
$status = "взрослый";
} else {
$status = "ребёнок";
}
// Сокращённая форма (Elvis operator) — PHP 5.3+
$name = $inputName ?: "Гость";
// Если $inputName truthy — вернёт его, иначе "Гость"
// Это эквивалентно:
$name = $inputName ? $inputName : "Гость";Null Coalescing Operator (??) — PHP 7+
<?php
// Возвращает левый операнд, если он существует и не null
$name = $_GET['name'] ?? "Гость";
// Эквивалентно:
$name = isset($_GET['name']) ? $_GET['name'] : "Гость";
// Можно цепочкой
$value = $a ?? $b ?? $c ?? "default";
// Вернёт первое не-null значение
// Присваивание ??= (PHP 7.4+)
$array['key'] ??= 'default';
// Присвоит 'default' только если $array['key'] не существует или nullNullsafe Operator (?->) — PHP 8+
<?php
// Без nullsafe — нужно много проверок
$country = null;
if ($user !== null) {
if ($user->address !== null) {
$country = $user->address->country;
}
}
// С nullsafe — элегантно
$country = $user?->address?->country;
// Если что-то null — вернёт null, без ошибкиПриоритет операторов
<?php
// Приоритет влияет на порядок вычислений
$result = 2 + 3 * 4; // 14 (не 20!)
$result = (2 + 3) * 4; // 20 (скобки меняют порядок)
// Таблица приоритетов (от высокого к низкому)
// 1. ** (возведение в степень)
// 2. ++ -- ~ (инкремент, декремент, побитовое НЕ)
// 3. ! (логическое НЕ)
// 4. * / % (умножение, деление, остаток)
// 5. + - . (сложение, вычитание, конкатенация)
// 6. < <= > >= <=> (сравнение)
// 7. == != === !== <> (равенство)
// 8. && (логическое И)
// 9. || (логическое ИЛИ)
// 10. ?? (null coalescing)
// 11. ? : (тернарный)
// 12. = += -= *= ... (присваивание)
// 13. and (логическое И, низкий приоритет)
// 14. xor (исключающее ИЛИ)
// 15. or (логическое ИЛИ, низкий приоритет)
// Совет: используй скобки для ясности
$result = ($a && $b) || $c; // Понятнее, чем $a && $b || $c5. Выражения и инструкции
Выражение (Expression)
Выражение — это всё, что имеет значение.
<?php
5 // Литерал — выражение
$x // Переменная — выражение
$x + 5 // Операция — выражение
sqrt(16) // Вызов функции — выражение
$x > 10 ? "да" : "нет" // Тернарный оператор — выражение
$x = 5 // Присваивание — тоже выражение! (возвращает 5)Инструкция (Statement)
Инструкция — это законченная единица выполнения, заканчивается ;.
<?php
$x = 5; // Инструкция
echo $x; // Инструкция
if ($x > 3) {} // Инструкция (управляющая конструкция)Блок кода
Блок — несколько инструкций в фигурных скобках:
<?php
{
$x = 5;
$y = 10;
echo $x + $y;
}6. Константы
Определение констант
<?php
// Способ 1: define() — можно в любом месте
define('MAX_SIZE', 100);
define('SITE_NAME', 'My Site');
define('DEBUG', true);
// Способ 2: const — только на верхнем уровне файла
const PI = 3.14159;
const GRAVITY = 9.8;
// Использование
echo MAX_SIZE; // 100
echo PI; // 3.14159
// Константы нельзя изменить
MAX_SIZE = 200; // Ошибка!Отличия констант от переменных
| Константа | Переменная |
|---|---|
Без $ | С $ |
| Нельзя изменить | Можно изменить |
| Глобальная видимость | Локальная видимость |
| Только скаляры и массивы | Любые типы |
Магические константы
PHP имеет встроенные "магические" константы:
<?php
echo __FILE__; // Полный путь к текущему файлу
echo __DIR__; // Директория текущего файла
echo __LINE__; // Номер текущей строки
echo __FUNCTION__; // Имя текущей функции
echo __CLASS__; // Имя текущего класса
echo __METHOD__; // Имя текущего метода (Класс::метод)
echo __NAMESPACE__; // Текущее пространство имён7. Практические примеры
Пример 1: Калькулятор скидки
<?php
$originalPrice = 1500;
$discountPercent = 20;
// Вычисляем скидку
$discountAmount = $originalPrice * ($discountPercent / 100);
$finalPrice = $originalPrice - $discountAmount;
echo "Исходная цена: {$originalPrice} руб.\n";
echo "Скидка: {$discountPercent}% ({$discountAmount} руб.)\n";
echo "Итого: {$finalPrice} руб.\n";Пример 2: Проверка возраста
<?php
$birthYear = 1995;
$currentYear = (int) date('Y'); // Текущий год как число
$age = $currentYear - $birthYear;
$canDrink = $age >= 21;
$canVote = $age >= 18;
$canDrive = $age >= 16;
$status = $canDrink ? "Может покупать алкоголь" : "Слишком молод";
echo "Возраст: $age лет\n";
echo "Голосовать: " . ($canVote ? "да" : "нет") . "\n";
echo "Водить: " . ($canDrive ? "да" : "нет") . "\n";
echo $status . "\n";Пример 3: Форматирование данных
<?php
$firstName = " иван ";
$lastName = "ПЕТРОВ";
$email = "Ivan.Petrov@Example.COM";
// Очистка и форматирование
$firstName = trim($firstName); // Убрать пробелы
$firstName = ucfirst(strtolower($firstName)); // Иван
$lastName = ucfirst(strtolower($lastName)); // Петров
$email = strtolower($email); // ivan.petrov@example.com
$fullName = $firstName . " " . $lastName;
echo "Имя: $fullName\n";
echo "Email: $email\n";Пример 4: Расчёт стоимости доставки
<?php
$weight = 2.5; // кг
$distance = 150; // км
$isExpress = true;
// Базовые тарифы
$pricePerKg = 50;
$pricePerKm = 5;
$expressMultiplier = 1.5;
// Расчёт
$baseCost = ($weight * $pricePerKg) + ($distance * $pricePerKm);
$finalCost = $isExpress ? $baseCost * $expressMultiplier : $baseCost;
// Округление
$finalCost = round($finalCost, 2);
echo "Вес: {$weight} кг\n";
echo "Расстояние: {$distance} км\n";
echo "Экспресс: " . ($isExpress ? "Да" : "Нет") . "\n";
echo "Стоимость: {$finalCost} руб.\n";8. Упражнения
Упражнение 1: Типы данных (10 минут)
Определи тип каждого значения и проверь себя с gettype():
<?php
$a = 42;
$b = "42";
$c = 42.0;
$d = true;
$e = null;
$f = [1, 2, 3];
$g = "true";
$h = "";
$i = 0;
$j = "0";
// Для каждой переменной:
// 1. Напиши, какой тип ты ожидаешь
// 2. Проверь: echo gettype($a);
// 3. Напиши, truthy это значение или falsyУпражнение 2: Операторы сравнения (15 минут)
Предскажи результат, потом проверь:
<?php
var_dump(5 == "5");
var_dump(5 === "5");
var_dump(0 == false);
var_dump(0 === false);
var_dump(null == false);
var_dump(null === false);
var_dump("" == false);
var_dump("0" == false);
var_dump([] == false);
var_dump(1 == true);
var_dump(2 == true);
var_dump("php" == 0);
var_dump("1php" == 1);Упражнение 3: Практический скрипт (20 минут)
Напиши скрипт, который:
- Имеет переменные:
$productName,$price,$quantity,$taxRate(налог в %) - Вычисляет:
- Сумму без налога
- Сумму налога
- Итоговую сумму
- Выводит красивый "чек":
===========================
ЧЕК
===========================
Товар: iPhone 15
Цена за шт.: 99990 руб.
Количество: 2
---------------------------
Сумма: 199980 руб.
НДС (20%): 39996 руб.
---------------------------
ИТОГО: 239976 руб.
===========================Упражнение 4: Конвертер температуры (15 минут)
Напиши скрипт, который:
- Имеет переменную
$celsius - Конвертирует в Фаренгейт:
F = C × 9/5 + 32 - Конвертирует в Кельвин:
K = C + 273.15 - Выводит все три значения с округлением до 2 знаков
Упражнение 5: Проверка данных (20 минут)
<?php
// Исходные данные (представь, что пришли из формы)
$username = " John_Doe123 ";
$email = "JOHN@Example.COM";
$age = "25";
$agree = "1";
// Задание:
// 1. Очисти username от пробелов
// 2. Проверь, что username содержит только буквы, цифры и _
// 3. Приведи email к нижнему регистру
// 4. Приведи age к числу
// 5. Приведи agree к boolean
// 6. Выведи все обработанные данные с их типами
// Подсказка для проверки username:
// preg_match('/^[a-zA-Z0-9_]+$/', $username)9. Вопросы для самопроверки
Чем отличается
==от===?Что выведет
echo "5" + "3";?Какие значения считаются
falseв PHP?В чём разница между
'строка'и"строка"?Что делает оператор
???Почему
0.1 + 0.2 == 0.3возвращаетfalse?Чем отличается
$a++от++$a?Что будет, если обратиться к несуществующей переменной?
10. Частые ошибки
Ошибка 1: Использование = вместо ==
<?php
// ❌ Ошибка
if ($x = 5) { // Это ПРИСВАИВАНИЕ, всегда true
echo "x равен 5";
}
// ✅ Правильно
if ($x == 5) {
echo "x равен 5";
}Ошибка 2: Нестрогое сравнение
<?php
$input = "0";
// ❌ Опасно
if ($input == false) {
echo "Пустой ввод"; // Сработает для "0"!
}
// ✅ Безопасно
if ($input === "" || $input === null) {
echo "Пустой ввод";
}Ошибка 3: Интерполяция в одинарных кавычках
<?php
$name = "Иван";
// ❌ Не работает
echo 'Привет, $name!'; // Выведет: Привет, $name!
// ✅ Работает
echo "Привет, $name!"; // Выведет: Привет, Иван!Ошибка 4: Сравнение float
<?php
$a = 0.1 + 0.2;
// ❌ Не работает
if ($a == 0.3) {
echo "Равно"; // НЕ выполнится!
}
// ✅ Работает
if (abs($a - 0.3) < 0.0001) {
echo "Примерно равно";
}Ошибка 5: Забыт $
<?php
// ❌ Ошибка
name = "Иван"; // Parse error
// ✅ Правильно
$name = "Иван";Резюме главы
┌────────────────────────────────────────────────────────────────┐
│ ЗАПОМНИ ГЛАВНОЕ │
├────────────────────────────────────────────────────────────────┤
│ │
│ ПЕРЕМЕННЫЕ │
│ • Начинаются с $ │
│ • Регистрозависимы ($name ≠ $Name) │
│ • Тип определяется автоматически │
│ │
│ ТИПЫ ДАННЫХ │
│ • string, int, float, bool — скалярные │
│ • array, object — составные │
│ • null — специальный │
│ │
│ СРАВНЕНИЕ │
│ • == с приведением типов (опасно!) │
│ • === без приведения (безопасно!) │
│ • Используй === по умолчанию │
│ │
│ ПОЛЕЗНЫЕ ОПЕРАТОРЫ │
│ • ?? — значение по умолчанию для null │
│ • ?: — Elvis, значение по умолчанию для falsy │
│ • ?-> — безопасный доступ к свойствам (PHP 8) │
│ │
│ СТРОКИ │
│ • 'одинарные' — без интерполяции │
│ • "двойные" — с интерполяцией $var или {$var} │
│ │
└────────────────────────────────────────────────────────────────┘Следующая глава: Глава 1.2: Условия и циклы — if/else, switch, match, for, foreach, while