Переменные в PHP: от простого к сложному
Основы работы с переменными в PHP
Переменные в PHP представляют собой контейнеры для хранения данных. Их объявление начинается с символа доллара ($), за которым следует имя. В отличие от многих языков, PHP не требует явного указания типа переменной - тип определяется автоматически на основе присвоенного значения. Это обеспечивает гибкость, но требует внимательности при работе с типами.
$name = 'Иван'; $age = 30; $isStudent = false; $salary = null; echo $name;переменные php какие (переменные в php)
Цель: хранение и использование данных в программе. Основной случай - любая программа на PHP начинается с объявления переменных для ввода/вывода, вычислений и логики.
Типичная ошибка: обращение к неопределённой переменной. Если переменная не была объявлена, PHP выдаёт Notice: Undefined variable. Решение: использовать функцию isset() для проверки перед использованием, или инициализировать переменную значением по умолчанию.
if (isset($unknown)) { echo $unknown; } else { echo 'Переменная не определена'; }Как объявить переменные разных типов?
PHP поддерживает восемь примитивных типов: четыре скалярных (bool, int, float, string), два смешанных (array, object), и два специальных (resource, null). Каждый тип имеет свои особенности.
$boolVar = true; $intVar = 42; $floatVar = 3.14; $stringVar = 'Hello'; $arrayVar = [1,2,3]; $nullVar = null; var_dump($boolVar, $intVar, $floatVar, $stringVar, $arrayVar, $nullVar);bool(true) int(42) float(3.14) string(5) "Hello" array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } NULLПроблема: автоматическое преобразование типов (type juggling) может привести к неожиданным результатам при сравнении. Например, "123" == 123 вернёт true. Решение: использовать строгое сравнение === и !==, а также явное приведение типов ((int), (string)).
Где доступны переменные? Область видимости
Область видимости определяет, где переменная может быть использована. В PHP есть локальная (внутри функции), глобальная (вне функций) и статическая (сохраняет значение между вызовами).
$globalVar = 'глобальная'; function test() { global $globalVar; $localVar = 'локальная'; static $count = 0; $count++; echo $globalVar . ', ' . $localVar . ', вызов #' . $count . '
'; } test(); test();глобальная, локальная, вызов #1 глобальная, локальная, вызов #2
Ошибка: забыть объявить глобальную переменную внутри функции приведёт к созданию новой локальной переменной с тем же именем. Решение: явно указывать global или передавать параметры. Избыточное использование глобальных переменных усложняет код - лучше передавать данные через аргументы.
Как получить данные из запроса или сессии?
Суперглобальные переменные - это предопределённые ассоциативные массивы, доступные в любом месте скрипта. Основные: $_GET, $_POST, $_REQUEST, $_SESSION, $_COOKIE, $_SERVER.
// Предположим, URL: example.com?name=John&age=30 $name = $_GET['name'] ?? 'неизвестно'; $age = $_GET['age'] ?? 0; echo 'Имя: ' . $name . ', Возраст: ' . $age;Имя: John, Возраст: 30
Опасность: прямые данные из запроса могут содержать вредоносный код (XSS, SQL-инъекции). Решение: всегда фильтровать и проверять входные данные. Использовать filter_input() или htmlspecialchars() при выводе.
$cleanName = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING); $cleanAge = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT);Как динамически создавать имена переменных?
Переменные переменные позволяют использовать значение одной переменной как имя другой. Синтаксис: $$varName.
$fruit = 'apple'; $$fruit = 'red'; echo $apple; echo $fruit;Проблема: код становится трудным для чтения и отладки, сложно отследить, какие переменные существуют. Решение: вместо переменных переменных использовать ассоциативные массивы - они нагляднее и безопаснее.
$vars = ['fruit' => 'apple', 'color' => 'red']; echo $vars['color'];Как передать переменную по ссылке?
Передача по ссылке (&) позволяет функции изменять оригинальную переменную, а не её копию. Это используется для модификации данных без возврата значения.
function addOne(&$num) { $num++; } $value = 10; addOne($value); echo $value;Ошибка: случайное изменение переменной, когда ожидается копия. Решение: использовать ссылки только когда это действительно необходимо (например, для больших массивов, чтобы избежать копирования). Лучше отдавать предпочтение возврату значений.
Переменные - основа любого PHP-приложения. Понимание их типов, области видимости и особенностей позволяет писать более надёжный и предсказуемый код.
Расширенные примеры работы с переменными в PHP
Здесь представлены более сложные сценарии, демонстрирующие продвинутые возможности переменных.
Пример 1: Статическая переменная в рекурсивной функции
Статическая переменная сохраняет своё значение между вызовами функции, что позволяет подсчитывать количество рекурсивных вызовов.
function factorial($n) { static $calls = 0; $calls++; echo 'Вызов #' . $calls . ' для n=' . $n . '
'; if ($n <= 1) return 1; return $n * factorial($n - 1); } echo 'Результат: ' . factorial(5);Вызов #1 для n=5 Вызов #2 для n=4 Вызов #3 для n=3 Вызов #4 для n=2 Вызов #5 для n=1 Результат: 120
Пример 2: Динамические имена переменных через массив
Вместо переменных переменных часто удобнее использовать ассоциативные массивы. Но можно имитировать динамическое создание с помощью цикла.
$keys = ['a', 'b', 'c']; $values = [10, 20, 30]; foreach ($keys as $index => $key) { $$key = $values[$index]; } echo 'a = ' . $a . ', b = ' . $b . ', c = ' . $c . '
'; $vars = array_combine($keys, $values); echo 'a = ' . $vars['a'] . ', b = ' . $vars['b'] . ', c = ' . $vars['c'];a = 10, b = 20, c = 30 a = 10, b = 20, c = 30
Пример 3: Безопасное получение и фильтрация данных из $_POST
Показывает использование filter_input для валидации и санитизации.
$_POST = ['email' => 'user@example.com', 'age' => '25']; $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 120]]); if ($email === false) { echo 'Некорректный email
'; } else { echo 'Email: ' . $email . '
'; } if ($age === false) { echo 'Некорректный возраст
'; } else { echo 'Возраст: ' . $age . '
'; }Email: user@example.com Возраст: 25
Пример 4: Передача массива по ссылке для модификации
Функция может изменять оригинальный массив, добавляя или удаляя элементы, без необходимости возвращать его.
function addItem(&$arr, $item) { $arr[] = $item; } $fruits = ['apple', 'banana']; addItem($fruits, 'cherry'); print_r($fruits);Array ( [0] => apple [1] => banana [2] => cherry )
Пример 5: Замыкание и захват переменных из внешней области
Анонимные функции могут захватывать переменные из родительской области с помощью use.
$multiplier = 3; $multiply = function($x) use ($multiplier) { return $x * $multiplier; }; echo $multiply(5) . '
'; $multiplier = 10; echo $multiply(5) . '
'; $multiplierRef = &$multiplier; $multiplyRef = function($x) use (&$multiplierRef) { return $x * $multiplierRef; }; echo $multiplyRef(5) . '
';15 15 50
Пример 6: Использование свойств класса как переменных
Переменные могут быть свойствами объектов. Доступ к ним возможен через $this или статически.
class Counter { public static $globalCount = 0; private $instanceCount = 0; public function increment() { self::$globalCount++; $this->instanceCount++; } public function getInstanceCount() { return $this->instanceCount; } } $c1 = new Counter(); $c2 = new Counter(); $c1->increment(); $c1->increment(); $c2->increment(); echo 'Глобальный счётчик: ' . Counter::$globalCount . '
'; echo 'Экземпляр c1: ' . $c1->getInstanceCount() . '
'; echo 'Экземпляр c2: ' . $c2->getInstanceCount() . '
';Глобальный счётчик: 3 Экземпляр c1: 2 Экземпляр c2: 1