Skip to content

Глава 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
<?php
$counter = $counter + 1;  // $counter не существует от предыдущего запроса!
echo $counter;            // Всегда будет 1 (или ошибка)

Каждый HTTP-запрос — это новая жизнь скрипта. Переменные, объекты, всё создаётся заново и уничтожается в конце.

Чтобы сохранять данные между запросами, используют:

  • Сессии (память на сервере)
  • Куки (память в браузере)
  • Базу данных (постоянное хранилище)
  • Файлы

1. Переменные

Что такое переменная?

Переменная — это именованный контейнер для хранения данных.

php
<?php
$name = "Иван";      // Переменная $name хранит строку "Иван"
$age = 25;           // Переменная $age хранит число 25
$price = 99.99;      // Переменная $price хранит дробное число

Представь переменную как коробку с наклейкой:

  • Наклейка — это имя переменной ($name)
  • Содержимое коробки — это значение ("Иван")

Синтаксис переменных

php
<?php
$variableName = value;

             └── Значение (что хранить)

 └── Имя переменной (начинается с буквы или _)

└── Знак доллара (обязателен!)

Правила именования

php
<?php
// ✅ Правильно
$name = "Иван";
$userName = "ivan";
$user_name = "ivan";
$_private = "secret";
$name2 = "Пётр";

// ❌ Неправильно
$2name = "ошибка";       // Нельзя начинать с цифры
$user-name = "ошибка";   // Нельзя использовать дефис
$user name = "ошибка";   // Нельзя использовать пробел
name = "ошибка";         // Забыт знак $

Регистрозависимость

Имена переменных чувствительны к регистру:

php
<?php
$name = "Иван";
$Name = "Пётр";
$NAME = "Сидор";

echo $name;  // Иван
echo $Name;  // Пётр
echo $NAME;  // Сидор

// Это ТРИ РАЗНЫЕ переменные!

Соглашения об именовании

php
<?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
<?php
// Простое присваивание
$x = 5;

// Можно присваивать результат выражения
$y = $x + 10;      // $y = 15

// Можно присваивать результат функции
$length = strlen("Hello");  // $length = 5

// Можно переприсваивать
$x = 5;
$x = 10;           // Теперь $x = 10
$x = "текст";      // Теперь $x = "текст" (тип изменился!)

Переменные переменных (Variable Variables)

Экзотика, но полезно знать:

php
<?php
$varName = "age";
$$varName = 25;     // Создаёт переменную $age = 25

echo $age;          // 25
echo $$varName;     // 25
echo ${$varName};   // 25 (более явный синтаксис)

2. Типы данных

PHP — динамически типизированный язык. Это значит:

  • Не нужно объявлять тип переменной
  • Тип определяется автоматически по значению
  • Тип может меняться во время выполнения

Скалярные типы (простые)

String (Строка)

php
<?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
<?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;     // -9223372036854775808

Float (Дробное число)

php
<?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
<?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
<?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
<?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
<?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
<?php
// Ресурс — это ссылка на внешний ресурс
$file = fopen("file.txt", "r");  // Ресурс файла
$db = mysqli_connect("localhost", "user", "pass");  // Ресурс соединения

// Ресурсы нужно закрывать!
fclose($file);
mysqli_close($db);

Определение типа

php
<?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
<?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
<?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
<?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
<?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
<?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
<?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
<?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
<?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
<?php
// Конкатенация (объединение строк)
$first = "Hello";
$second = "World";

$result = $first . " " . $second;  // "Hello World"

// Конкатенация с присваиванием
$str = "Hello";
$str .= " World";  // "Hello World"

// Интерполяция (в двойных кавычках)
$name = "Иван";
echo "Привет, $name!";  // Привет, Иван!

Операторы инкремента/декремента

php
<?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
<?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
<?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'] не существует или null

Nullsafe Operator (?->) — PHP 8+

php
<?php
// Без nullsafe — нужно много проверок
$country = null;
if ($user !== null) {
    if ($user->address !== null) {
        $country = $user->address->country;
    }
}

// С nullsafe — элегантно
$country = $user?->address?->country;
// Если что-то null — вернёт null, без ошибки

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

php
<?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 || $c

5. Выражения и инструкции

Выражение (Expression)

Выражение — это всё, что имеет значение.

php
<?php
5                    // Литерал — выражение
$x                   // Переменная — выражение
$x + 5               // Операция — выражение
sqrt(16)             // Вызов функции — выражение
$x > 10 ? "да" : "нет"  // Тернарный оператор — выражение
$x = 5               // Присваивание — тоже выражение! (возвращает 5)

Инструкция (Statement)

Инструкция — это законченная единица выполнения, заканчивается ;.

php
<?php
$x = 5;              // Инструкция
echo $x;             // Инструкция
if ($x > 3) {}       // Инструкция (управляющая конструкция)

Блок кода

Блок — несколько инструкций в фигурных скобках:

php
<?php
{
    $x = 5;
    $y = 10;
    echo $x + $y;
}

6. Константы

Определение констант

php
<?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
<?php
echo __FILE__;      // Полный путь к текущему файлу
echo __DIR__;       // Директория текущего файла
echo __LINE__;      // Номер текущей строки
echo __FUNCTION__;  // Имя текущей функции
echo __CLASS__;     // Имя текущего класса
echo __METHOD__;    // Имя текущего метода (Класс::метод)
echo __NAMESPACE__; // Текущее пространство имён

7. Практические примеры

Пример 1: Калькулятор скидки

php
<?php
$originalPrice = 1500;
$discountPercent = 20;

// Вычисляем скидку
$discountAmount = $originalPrice * ($discountPercent / 100);
$finalPrice = $originalPrice - $discountAmount;

echo "Исходная цена: {$originalPrice} руб.\n";
echo "Скидка: {$discountPercent}% ({$discountAmount} руб.)\n";
echo "Итого: {$finalPrice} руб.\n";

Пример 2: Проверка возраста

php
<?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
<?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
<?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
<?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
<?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 минут)

Напиши скрипт, который:

  1. Имеет переменные: $productName, $price, $quantity, $taxRate (налог в %)
  2. Вычисляет:
    • Сумму без налога
    • Сумму налога
    • Итоговую сумму
  3. Выводит красивый "чек":
===========================
         ЧЕК
===========================
Товар: iPhone 15
Цена за шт.: 99990 руб.
Количество: 2
---------------------------
Сумма: 199980 руб.
НДС (20%): 39996 руб.
---------------------------
ИТОГО: 239976 руб.
===========================

Упражнение 4: Конвертер температуры (15 минут)

Напиши скрипт, который:

  • Имеет переменную $celsius
  • Конвертирует в Фаренгейт: F = C × 9/5 + 32
  • Конвертирует в Кельвин: K = C + 273.15
  • Выводит все три значения с округлением до 2 знаков

Упражнение 5: Проверка данных (20 минут)

php
<?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. Вопросы для самопроверки

  1. Чем отличается == от ===?

  2. Что выведет echo "5" + "3";?

  3. Какие значения считаются false в PHP?

  4. В чём разница между 'строка' и "строка"?

  5. Что делает оператор ???

  6. Почему 0.1 + 0.2 == 0.3 возвращает false?

  7. Чем отличается $a++ от ++$a?

  8. Что будет, если обратиться к несуществующей переменной?


10. Частые ошибки

Ошибка 1: Использование = вместо ==

php
<?php
// ❌ Ошибка
if ($x = 5) {  // Это ПРИСВАИВАНИЕ, всегда true
    echo "x равен 5";
}

// ✅ Правильно
if ($x == 5) {
    echo "x равен 5";
}

Ошибка 2: Нестрогое сравнение

php
<?php
$input = "0";

// ❌ Опасно
if ($input == false) {
    echo "Пустой ввод";  // Сработает для "0"!
}

// ✅ Безопасно
if ($input === "" || $input === null) {
    echo "Пустой ввод";
}

Ошибка 3: Интерполяция в одинарных кавычках

php
<?php
$name = "Иван";

// ❌ Не работает
echo 'Привет, $name!';  // Выведет: Привет, $name!

// ✅ Работает
echo "Привет, $name!";  // Выведет: Привет, Иван!

Ошибка 4: Сравнение float

php
<?php
$a = 0.1 + 0.2;

// ❌ Не работает
if ($a == 0.3) {
    echo "Равно";  // НЕ выполнится!
}

// ✅ Работает
if (abs($a - 0.3) < 0.0001) {
    echo "Примерно равно";
}

Ошибка 5: Забыт $

php
<?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

Выпущено под лицензией MIT