Статические переменные в функциях

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

В этом тренажере мы разберемся со статическими переменными в PHP. Вы узнаете, как они "запоминают" свои значения между вызовами функции, в отличие от обычных локальных переменных. Это очень полезное свойство для создания счетчиков, кэширования результатов или управления состоянием без использования глобальных переменных.

Мы начнем с самых основ — как объявить такую переменную с помощью ключевого слова static. Затем перейдем к практике: вы будете предсказывать результаты работы кода, исправлять ошибки, где эта концепция нарушена, и собирать функции из готовых частей. Задания построены так, чтобы вы наглядно увидели разницу в поведении статических и обычных переменных и поняли, в каких ситуациях их применение наиболее эффективно.

Список тем

Объявление статической переменной

id: 39002_task_static_1

Перед вами функция-счетчик. Чтобы она работала правильно и считала количество своих вызовов, переменная `$count` должна сохранять свое значение. Дополните код, добавив необходимое ключевое слово для объявления статической переменной.

Заполните пропуски
<?php
function counter() {
    input1S $count = 0;
    $count++;
    echo "Количество вызовов: " . $count . "<br>";
}

counter();
counter();
counter();
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Предсказание результата со статической переменной

id: 39002_task_static_2

Проанализируйте код. Функция `increment()` вызывается три раза. Какое значение будет выведено на экран во время третьего вызова? Выберите правильный вариант ответа.

Выберите правильный вариант ответа
<?php
function increment() {
    static $value = 10;
    $value++;
    echo "Текущее значение: " . $value;
}

increment(); // Первый вызов
increment(); // Второй вызов
increment(); // Третий вызов
?>
Сообщения
Проверить
Показать подсказку

Исправление логической ошибки

id: 39002_task_static_3

Функция `trackVisit()` задумана для отслеживания посещений, но каждый раз она выводит "Визит номер: 1". Это происходит потому, что счетчик сбрасывается при каждом вызове. Найдите строку с ошибкой и исправьте ее так, чтобы счетчик работал корректно.

Найдите ошибку и исправьте
<?php
function trackVisit() {
    $visitCount = 0;
    $visitCount++;
    echo "Визит номер: " . $visitCount . "\n";
}
 
trackVisit();
trackVisit();
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Какой будет полный вывод?

id: 39002_task_static_4

Внимательно посмотрите на код. Функция `generateId()` вызывается в цикле 4 раза. Она должна генерировать последовательные ID, начиная с 1. Введите в поле ответа полный результат, который выведет этот скрипт. Обратите внимание на пробелы между числами.

Что должно получиться?
<?php
function generateId() {
    static $id = 0;
    $id++;
    return $id;
}

for ($i = 0; $i < 4; $i++) {
    echo generateId() . " ";
}
?>
Сообщения
Проверить
Показать подсказку

Соберите функцию для кэширования

id: 39002_task_static_5

Соберите из частей функцию `getHeavyData()`. Она должна "вычислять" данные только один раз (при первом вызове), а при последующих — возвращать сохраненный (закэшированный) результат. Лишние строки в сборке не участвуют.

Перетяните в правильном порядке строки из одного блока в другой
if ($cache === null) {
}
function getHeavyData() {
        $cache = "Данные вычислены: " . rand(100, 999);
    static $cache = null;
    global $cache;
    return $cache;
    }
echo $cache;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Сравнение областей видимости

id: 39002_task_static_6

Сопоставьте тип переменной в PHP с ее описанием. Перетащите описания из правой колонки так, чтобы они соответствовали терминам в левой.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Переменная `static`
Переменная `global`
Локальная переменная
Доступна в глобальной области видимости и требует импорта в функцию с помощью ключевого слова.
Существует только во время выполнения функции и уничтожается после ее завершения.
Сохраняет свое значение между вызовами одной и той же функции.
Сообщения
Проверить
Показать подсказку

Сборка функции из банка токенов

id: 39002_task_static_7

Соберите рабочую функцию-счетчик `countUp()`, перетаскивая элементы из "банка" в пустые ячейки. Некоторые элементы в банке лишние и не понадобятся.

Нужно правильно расставить в пропуски предложенные варианты
function countUp() {
    input1S input2S = 0;
    $i input3S;
    echo input4S;
}
static
$i
echo
++
=
$i
global
--
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Статический массив

id: 39002_task_static_8

Функция `logger()` добавляет сообщение в статический массив `$logs` при каждом вызове. Что выведет `count($logs)` после третьего вызова функции? Введите одно число.

Что должно получиться?
<?php
function logger($message) {
    static $logs = [];
    $logs[] = $message;
    // Для отладки вернем массив
    return $logs;
}

logger("Init");
logger("Process");
$final_logs = logger("Done");

echo count($final_logs);
?>
Сообщения
Проверить
Показать подсказку

Ошибка инициализации статической переменной

id: 39002_task_static_9

Этот код вызовет фатальную ошибку. Статические переменные в PHP могут быть инициализированы только литералами или константами, но не результатом вызова функции. Исправьте строку с ошибкой так, чтобы переменная инициализировалась значением `null`, а ее установка происходила внутри блока `if`.

Найдите ошибку и исправьте
<?php
function getDbConnection() {
    // Ошибка: нельзя вызывать функцию при инициализации
    static $connection = new PDO("sqlite::memory:");
    return $connection;
}
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру