Урок 03

Переменные и типы данных

Переменные

Переменная — именованное хранилище значения.

Объявление:

$name = 'Иван';
$age = 25;
$isActive = true;

Правила:

  • Начинается с $.
  • Дальше — буква или _, потом буквы, цифры, _.
  • Регистрозависимы: $name и $Name — разные.
  • Нельзя начинать с цифры.

Примеры:

$user_name = 'Иван';       // ✅
$_private = 1;              // ✅
$userName2 = 'Мария';       // ✅
$2user = 'Пётр';            // ❌ ошибка

Слабая типизация

PHP — язык со слабой динамической типизацией. Тип переменной определяется значением.

$x = 5;        // int
$x = 'строка'; // теперь string
$x = true;     // теперь bool

Одна переменная может менять тип. Это удобно, но опасно — легко получить баг.

Строгий режим

declare(strict_types=1) в начале файла:

<?php

declare(strict_types=1);

Что даёт:

  • Типы проверяются строго при передаче в функции.
  • Без него '5' автоматически превратится в 5.
  • Со строгим режимом — ошибка TypeError.

Правило: всегда включай declare(strict_types=1) в новых файлах.

Основные типы

int — целые числа

$a = 42;
$b = -100;
$c = 0;
$big = 1_000_000;   // можно разделять `_` для читаемости

Диапазон зависит от системы: обычно -9.2×10¹⁸ до 9.2×10¹⁸ (64-bit).

Бинарные, восьмеричные, шестнадцатеричные:

$bin = 0b1010;   // 10
$oct = 0o777;    // 511
$hex = 0xFF;     // 255

float — числа с плавающей точкой

$pi = 3.14;
$big = 1.5e3;   // 1500
$small = 1.5e-3; // 0.0015

⚠️ Осторожно с точностью:

var_dump(0.1 + 0.2 === 0.3);   // false!
// Потому что 0.1 + 0.2 = 0.30000000000000004

Решение — сравнивать с точностью:

if (abs(0.1 + 0.2 - 0.3) < 0.00001) {
    echo 'равны';
}

Для денег используй integer (копейки) или библиотеку brick/money.

string — строки

Одинарные кавычки — без интерполяции:

$name = 'Иван';
echo 'Привет, $name';   // Привет, $name

Двойные кавычки — с интерполяцией:

$name = 'Иван';
echo "Привет, $name";   // Привет, Иван

Heredoc / Nowdoc:

$text = <<<TEXT
Многострочный
текст с $name
TEXT;

$raw = <<<'TEXT'
Без интерполяции: $name
TEXT;

Правило: одинарные кавычки быстрее, используй их, когда не нужна интерполяция.

bool — булев тип

$active = true;
$deleted = false;

Регистр: true, false — регистронезависимы, но пиши с маленькой буквы.

Приведение:

(bool) 0;         // false
(bool) '';        // false
(bool) '0';       // false
(bool) [];        // false
(bool) null;      // false
(bool) 1;         // true
(bool) -1;        // true
(bool) 'строка';  // true
(bool) [0];       // true (массив непустой)

null

Означает «нет значения»:

$user = null;

is_null() — проверка:

if (is_null($user)) {
    echo 'нет пользователя';
}

?? — null coalescing:

$name = $user['name'] ?? 'Гость';

?-> — nullsafe operator (PHP 8+):

$city = $user?->address?->city;

array — массивы

$fruits = ['яблоко', 'банан'];
$user = ['name' => 'Иван', 'age' => 25];

Про массивы — отдельные уроки.

object — объекты

class User {}
$user = new User();

Про ООП — отдельный курс.

callable — вызываемое

$fn = 'strlen';
$fn2 = fn($x) => $x * 2;

iterable — перебираемое

Массивы + объекты, реализующие Traversable.

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

Функции:

is_int($x);       // целое
is_float($x);     // float
is_string($x);    // строка
is_bool($x);      // булево
is_array($x);     // массив
is_null($x);      // null
is_object($x);    // объект
is_callable($x);  // вызываемое
is_numeric($x);   // число или строка-число

Пример:

$x = '5';
var_dump(is_int($x));      // false
var_dump(is_numeric($x));  // true

gettype и var_dump

$x = 3.14;

var_dump($x);         // float(3.14)
echo gettype($x);     // double

gettype возвращает устаревшие названия (double вместо float). Используй get_debug_type() (PHP 8+):

echo get_debug_type($x);   // float

Приведение типов

Явное:

$int = (int) '42';          // 42
$float = (float) '3.14';    // 3.14
$string = (string) 100;     // '100'
$bool = (bool) 0;           // false
$array = (array) 'x';       // ['x']

Функции:

intval('42');       // 42
floatval('3.14');   // 3.14
strval(100);        // '100'
boolval(0);         // false
settype($x, 'int'); // меняет тип переменной

Неявное приведение

PHP приводит типы автоматически:

$a = '5' + 3;      // 8 (string → int)
$b = '5' . 3;      // '53' (int → string)
$c = 'abc' + 1;    // 1 (PHP 8: TypeError)

В PHP 8 неявные приведения стали строже — нечисловые строки больше не превращаются в 0 молча.

Константы

define() — старый способ:

define('APP_NAME', 'My App');
echo APP_NAME;

const — современный:

const APP_NAME = 'My App';
const MAX_USERS = 100;

Разница:

  • const работает на уровне класса и глобально.
  • define — только глобально, но может быть в условии.

Правило: используй const.

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

__FILE__      // путь к файлу
__DIR__       // директория
__LINE__      // номер строки
__FUNCTION__  // имя функции
__CLASS__     // имя класса
__METHOD__    // имя метода
__NAMESPACE__ // текущий namespace

Пример:

echo __DIR__;   // /var/www/app

__DIR__ — очень полезно для подключения файлов.

Именование

Соглашение (PSR-12):

  • Переменные — camelCase: $userName, $isActive.
  • Функции — camelCase: getUserName(), isActive().
  • Классы — PascalCase: UserController, Product.
  • Константы — SCREAMING_SNAKE_CASE: MAX_SIZE, APP_ENV.

Пример:

const MAX_LOGIN_ATTEMPTS = 5;

$failedAttempts = 0;

function incrementAttempts(int &$counter): void
{
    $counter++;
}

Итог

  • Переменные — $name, регистрозависимы.
  • declare(strict_types=1) — включай всегда.
  • Типы: int, float, string, bool, null, array, object.
  • Проверка: is_int(), is_string() и др.
  • Приведение: (int), intval().
  • Константы: const, SCREAMING_SNAKE_CASE.

Дальше — операторы и выражения.