Переменные и типы данных
Переменные
Переменная — именованное хранилище значения.
Объявление:
$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.
Дальше — операторы и выражения.