fa
Feedback
PHP | Вопросы собесов

PHP | Вопросы собесов

رفتن به کانال در Telegram
2 360
مشترکین
+124 ساعت
-57 روز
-1730 روز
آرشیو پست ها
Аренда VPS/VDS-сервера. Виртуальные выделенные серверы в дата-центрах уровня Tier III — 7 готовых конфигураций от 200 ₽/мес.
Аренда VPS/VDS-сервера. Виртуальные выделенные серверы в дата-центрах уровня Tier III — 7 готовых конфигураций от 200 ₽/мес. Преимущества аренды: - Выделенные ресурсы без переплаты; - KVM-виртуализация; - Быстрые NVMe SSD; - Соответствие 152-ФЗ, PCI DSS; - Бесплатная защита от DDoS; - Управление через панель, API и Terraform; - Техподдержка 24/7. Запустите сервер за несколько минут! Попробовать #реклама 16+ selectel.ru О рекламодателе

ИН:Ритейл 21 мая приглашаем всех, кто определяет стратегию развития и маркетинга бизнесов в ритейле, обсудить ситуацию на рын
ИН:Ритейл 21 мая приглашаем всех, кто определяет стратегию развития и маркетинга бизнесов в ритейле, обсудить ситуацию на рынке в новых условиях, вызовы 2026 года и перспективы. Отдельный фокус — на технологиях и инструментах, которые помогают бизнесу отвечать на новые вызовы: как меняется эффективность привлечения, как растёт измеримость рекламных каналов и какую роль играют новые форматы в маркетинговом миксе. Встречаемся 21 мая в Москве. Для тех, кто не сможет приехать, организуем онлайн-трансляцию. Мероприятие бесплатное, нужно только зарегистрироваться. Зарегистрироваться #реклама yandex.ru О рекламодателе

Главный навык на ближайшие годы — ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запуска
Главный навык на ближайшие годы — ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запускать продукты быстрее, чем это делали классические команды разработки. И это уже не "будущее когда-нибудь", а реальность, которая меняет рынок уже сегодня И те, кто научится вайбкодить сейчас, будут увереннее конкурировать на рынке и зарабатывать больше тех, кто по-прежнему делает всё вручную. Стартовать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы. Подписывайтесь, нас уже 30 тысяч: @vibecoding_tg

Яндекс Музыка до 360 дней бесплатно Яндекс Музыка для вас и 3-х ваших близких. Кинопоиск и Яндекс Книги тоже в подписке. Попр
Яндекс Музыка до 360 дней бесплатно Яндекс Музыка для вас и 3-х ваших близких. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте бесплатно❤️ Слушать #реклама 18+ music.yandex.ru О рекламодателе

Яндекс Музыка до 360 дней бесплатно Яндекс Музыка для вас и 3-х ваших близких. Кинопоиск и Яндекс Книги тоже в подписке. Попр
Яндекс Музыка до 360 дней бесплатно Яндекс Музыка для вас и 3-х ваших близких. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте бесплатно❤️ Слушать #реклама 18+ music.yandex.ru О рекламодателе

🤔 Какие бывают области видимости? Область видимости (или видимость) определяет, где в коде можно получить доступ к переменным, функциям и другим объектам. В PHP есть несколько видов областей видимости, которые контролируют доступность этих элементов в разных частях программы. 🚩Основные области видимости 🟠Локальная область видимости Переменные, объявленные внутри функции, имеют локальную область видимости и доступны только внутри этой функции.
<?php
function test() {
    $localVar = "I'm local";
    echo $localVar; // Выведет "I'm local"
}
test();
echo $localVar; // Ошибка: переменная не найдена
?>
🟠Глобальная область видимости Переменные, объявленные вне функций и классов, имеют глобальную область видимости и доступны везде в скрипте, кроме внутренних областей видимости (например, внутри функций), если не использовать ключевое слово global.
<?php
$globalVar = "I'm global";

function test() {
    global $globalVar;
    echo $globalVar; // Выведет "I'm global"
}

test();
?>
🟠Область видимости функций и методов Переменные, объявленные внутри функции или метода класса, имеют свою локальную область видимости и не видны за её пределами.
<?php
class Test {
    public function method() {
        $localVar = "I'm local in method";
        echo $localVar; // Выведет "I'm local in method"
    }
}

$test = new Test();
$test->method();
echo $localVar; // Ошибка: переменная не найдена
?>
🟠Область видимости классов Публичная (public) Публичные свойства и методы доступны отовсюду: как внутри класса, так и вне его.
<?php
class Test {
    public $publicVar = "I'm public";

    public function publicMethod() {
        echo $this->publicVar;
    }
}

$test = new Test();
echo $test->publicVar; // Доступно и выведет "I'm public"
$test->publicMethod(); // Доступно и выведет "I'm public"
?>
🟠Защищённая (protected) Защищённые свойства и методы доступны только внутри класса и его наследников.
<?php
class Base {
    protected $protectedVar = "I'm protected";

    protected function protectedMethod() {
        echo $this->protectedVar;
    }
}

class Derived extends Base {
    public function accessProtected() {
        echo $this->protectedVar; // Доступно
        $this->protectedMethod(); // Доступно
    }
}

$derived = new Derived();
$derived->accessProtected(); // Выведет "I'm protected"
// echo $derived->protectedVar; // Ошибка: доступ запрещен
// $derived->protectedMethod(); // Ошибка: доступ запрещен
?>
🟠Приватная (private) Приватные свойства и методы доступны только внутри класса, в котором они объявлены, и недоступны в наследниках.
<?php
class Test {
    private $privateVar = "I'm private";

    private function privateMethod() {
        echo $this->privateVar;
    }

    public function accessPrivate() {
        $this->privateMethod(); // Доступно
    }
}

$test = new Test();
$test->accessPrivate(); // Выведет "I'm private"
// echo $test->privateVar; // Ошибка: доступ запрещен
// $test->privateMethod(); // Ошибка: доступ запрещен
?>
🟠Локальная область видимости Переменные доступны только внутри функции или метода, где они объявлены. 🟠Глобальная область видимости Переменные доступны везде в скрипте, кроме внутренних областей видимости, если не используется global. 🟠Публичная область видимости Свойства и методы доступны отовсюду. 🟠Защищённая область видимости Свойства и методы доступны только внутри класса и его наследников. 🟠Приватная область видимости Свойства и методы доступны только внутри класса, в котором они объявлены. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое поведение copy-on-write? Это механизм оптимизации памяти, при котором копия объекта создаётся только в случае изменения исходного объекта. До изменений объекты разделяют один и тот же адрес в памяти. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое абстрагирование? Это принцип программирования и проектирования, который позволяет выделить важные характеристики объекта или системы и скрыть их сложные детали. Основная цель абстрагирования – упростить сложные системы, делая их более понятными и управляемыми, сосредоточив внимание на их основных аспектах и поведении. 🚩Зачем нужно абстрагирование 🟠Снижение сложности Сокращает количество деталей, с которыми нужно работать, что облегчает понимание и работу с системой. 🟠Повышение читаемости кода Упрощает код, делая его более читаемым и легким для поддержки. 🟠Повторное использование кода Создаёт возможность повторного использования общих функций и логики. 🟠Инкапсуляция Позволяет скрывать реализацию и представлять только необходимые интерфейсы для взаимодействия. 🟠Гибкость и расширяемость Облегчает добавление новых функциональностей без изменения существующего кода. 🚩Как используется абстрагирование Абстрагирование в программировании часто реализуется через классы и интерфейсы. Ниже приведены примеры абстракции в объектно-ориентированном программировании (ООП). 🚩Пример абстракции с использованием классов и интерфейсов 🟠Интерфейс Определяет набор методов, которые должны быть реализованы, не указывая, как именно они должны быть реализованы.
interface Shape {
    public function draw();
}
🟠Классы, реализующие интерфейс Реализуют методы, определённые в интерфейсе.
class Circle implements Shape {
    public function draw() {
        echo "Drawing a circle";
    }
}

class Square implements Shape {
    public function draw() {
        echo "Drawing a square";
    }
}
Использование абстракции
function renderShape(Shape $shape) {
    $shape->draw();
}

$circle = new Circle();
$square = new Square();

renderShape($circle); // Вывод: Drawing a circle
renderShape($square); // Вывод: Drawing a square
🚩Плюсы и минусы ➕Снижение сложности Абстракция скрывает сложные детали реализации, облегчая работу с системой. ➕Улучшение читаемости Код становится более понятным и структурированным. ➕Гибкость и расширяемость Облегчает добавление новых функций и изменений. ➕Повторное использование Позволяет использовать общий код в разных частях программы. ➖Избыточность Иногда может приводить к избыточной сложности, если абстракции слишком сложные или используются неправильно. ➖Накладные расходы Может потребоваться больше времени и усилий на создание абстракций и их поддержку. Ставь 👍 и забирай 📚 Базу знаний

🤔 Слово "global" для чего используется? Слово global позволяет получить доступ к переменной, определённой за пределами текущей функции. Используется, чтобы модифицировать глобальные переменные внутри функций. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем преимущество фасада? Фасад (Facade) в PHP — это паттерн проектирования, который упрощает доступ к сложной системе классов, предоставляя единый интерфейс. 🚩ПлюсыУпрощает код Фасад скрывает сложные детали реализации и предоставляет удобный интерфейс.
$logger = new Logger();
$db = new DatabaseConnection();
$mailer = new Mailer();

$user = new User($db, $logger, $mailer);
$user->register("example@example.com");
С фасадом (всё инкапсулировано в один класс)
$userFacade = new UserFacade();
$userFacade->register("example@example.com");
Ослабляет зависимость кода от реализации Вы можете изменять внутреннюю структуру классов без влияния на клиентский код. ➕Улучшает поддержку и масштабируемость - Если нужно добавить новую функциональность, можно просто изменить фасад, не переписывая весь код. - Удобно при развитии проекта и подключении новых сервисов. 🚩Пример фасада в PHP
class PaymentGateway {
    public function processPayment($amount) {
        echo "Оплата на сумму $amount выполнена.\n";
    }
}

class NotificationService {
    public function sendNotification($message) {
        echo "Отправлено уведомление: $message\n";
    }
}

class OrderFacade {
    private $payment;
    private $notification;

    public function __construct() {
        $this->payment = new PaymentGateway();
        $this->notification = new NotificationService();
    }

    public function placeOrder($amount) {
        $this->payment->processPayment($amount);
        $this->notification->sendNotification("Заказ оплачен на сумму $amount.");
    }
}

// Использование
$order = new OrderFacade();
$order->placeOrder(1000);
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое индекс? Индекс в контексте баз данных — это структура данных, которая улучшает скорость операций поиска/выборки данных, но может замедлить добавление, удаление и обновление данных из-за необходимости поддерживать индекс в актуальном состоянии.? Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие виды уязвимости знаешь? В веб-разработке существует множество уязвимостей, но самые распространенные SQL-инъекции (SQL Injection) Межсайтовый скриптинг (XSS – Cross-Site Scripting) Межсайтовая подделка запросов (CSRF – Cross-Site Request Forgery) Ошибки аутентификации и управления сессиями Необработанные пользовательские данные Доступ к файлам и директориям (LFI/RFI – Local/Remote File Inclusion) Ошибки конфигурации сервера и утечки данных 🟠SQL-инъекции (SQL Injection) Атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос, получая доступ к БД. Чтение / изменение данных Удаление таблиц Получение паролей пользователей Используем подготовленные запросы (Prepared Statements)
$db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
$stmt = $db->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute([':email' => $_POST['email']]);
$user = $stmt->fetch();
🟠Межсайтовый скриптинг (XSS – Cross-Site Scripting) Атака, при которой злоумышленник вставляет вредоносный JavaScript в веб-страницу. Кража cookies и сеансов Изменение содержимого страницы Фишинг Очистка данных перед выводом
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
🟠Межсайтовая подделка запросов (CSRF – Cross-Site Request Forgery) Злоумышленник заставляет пользователя выполнить нежелательный запрос от его имени (например, перевести деньги). Изменение данных без ведома пользователя Подмена учетных записей Используем CSRF-токены
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
При отправке формы проверяем
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die("CSRF атака!");
}
🟠Ошибки аутентификации и управления сессиями Если пароли хранятся неправильно или сессии уязвимы, злоумышленник может перехватить учетную запись пользователя. Кража пароля Перехват сессии Храним пароли с password_hash(), а не в открытом виде:
$hash = password_hash("mypassword", PASSWORD_BCRYPT);
🟠Необработанные пользовательские данные Приложение принимает и использует входные данные без проверки. Возможность загрузки вредоносных файлов Выполнение вредоносного кода Проверяем загружаемые файлы (MIME-тип, расширение) Используем валидацию данных:
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
🟠Доступ к файлам и директориям (LFI/RFI) Злоумышленник может загружать и выполнять опасные файлы через параметры в URL. Выполнение кода на сервере Чтение конфиденциальных файлов Запрещаем прямую загрузку файлов:
$whitelist = ['jpg', 'png', 'gif'];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, $whitelist)) {
    die("Недопустимый файл!");
}
🟠Ошибки конфигурации сервера и утечки данных Если сервер настроен неправильно, можно случайно раскрыть важные данные. Вывод ошибок PHP в браузере Доступ к файлам .env, config.php Отключаем display_errors в php.ini:
display_errors = Off
Защищаем файлы .env через .htaccess
  <Files .env>
      Order allow,deny
      Deny from all
  </Files>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Сколькими способами можно создать ветку в Git? Создать ветку в Git можно: 1. Командой git branch <имя> – создаст новую ветку. 2. git checkout -b <имя> – создаст и сразу переключится. 3. git switch -c <имя> – альтернатива checkout. 4. В графических интерфейсах (GitKraken, SourceTree) – создание через UI. 5. В удаленном репозитории (GitHub, GitLab) – через web-интерфейс Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как сделать так, чтобы приложение разворачивалось быстрее в Docker`е? При развёртывании приложения в Docker важно минимизировать время сборки и оптимизировать слои контейнера. 🟠Использовать `.dockerignore` Не копировать лишние файлы в контейнер (например, node_modules, .git, vendor, .env).
.git
node_modules
vendor
.env
*.log
🟠Оптимизировать `Dockerfile` (Меньше слоёв, кэширование) Плохо (лишние слои, без кэширования)
FROM php:8.2-cli

WORKDIR /app

COPY . .      # Копирует ВСЕ файлы (долго и некэшируемо)
RUN composer install
RUN npm install
RUN npm run build
Хорошо (разделение слоёв, кэширование)
FROM php:8.2-cli

WORKDIR /app

COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist # Используем кэширование слоёв

COPY package.json package-lock.json ./
RUN npm install --only=production && npm cache clean --force

COPY . . # Копируем код ПОСЛЕ установки зависимостей (чтобы кэширование работало)
RUN npm run build
🟠Использовать `multi-stage builds` (если контейнер весит много) Позволяет уменьшить размер конечного образа, убрав ненужные файлы и инструменты.
# 1-й этап: сборка зависимостей (Node.js)
FROM node:18 as frontend
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# 2-й этап: финальный образ
FROM php:8.2-cli
WORKDIR /app
COPY --from=frontend /app/dist /app/public # Берём только готовые файлы
COPY . .
CMD ["php", "artisan", "serve", "--host=0.0.0.0"]
🟠Использовать `docker build --cache-from` Позволяет использовать кеш из предыдущих сборок.
docker build --cache-from=myapp:latest -t myapp .
🟠Оптимизировать `docker-compose` (если используется) Перенести volume для vendor и node_modules на хост, чтобы не скачивать их в контейнере.
services:
  app:
    build: .
    volumes:
      - .:/app
      - /app/vendor  # Чтобы composer install не запускался каждый раз
      - /app/node_modules # Чтобы npm install не замедлял перезапуск
🟠Использовать `Alpine Linux` (если важен размер образа) Alpine – лёгкая версия Linux (~5 MB), подходит для PHP, Nginx, Node.js.
FROM php:8.2-fpm-alpine
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое DI Container? Это инструмент для управления зависимостями приложения. • Он автоматически создаёт объекты и предоставляет их другим компонентам, решая, какие зависимости инъектировать. • Контейнер упрощает реализацию DI, улучшает модульность и тестируемость приложения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Для чего предназначены форматы запросов и ответов приложения? Форматы запросов и ответов в приложении предназначены для стандартизированного обмена данными между клиентом (браузером, мобильным приложением) и сервером (PHP-приложением). Они позволяют: Обеспечить совместимость между разными системами Облегчить обработку данных на сервере и клиенте Структурировать данные в удобном формате 🚩Форматы запросов (Request Formats) Когда клиент отправляет запрос на сервер, данные могут передаваться разными способами. 🟠GET – передача данных через URL Используется для получения информации. Данные передаются в строке запроса.
GET /api/users?id=10
Пример обработки в PHP
$id = $_GET['id']; // Получаем id из URL
🟠POST – передача данных в теле запроса Используется для отправки данных (например, формы).
POST /api/users
Content-Type: application/json

{
    "name": "Иван",
    "email": "ivan@example.com"
}
Пример обработки в PHP
$data = json_decode(file_get_contents("php://input"), true);
echo "Имя: " . $data['name'];
🟠PUT, PATCH, DELETE – для обновления и удаления данных Используются в REST API для изменения или удаления данных. 🚩Форматы ответов (Response Formats) Сервер отправляет ответ в определённом формате, который клиент сможет распознать. 🟠JSON – самый популярный формат Используется в API и веб-приложениях.
{
    "status": "success",
    "message": "Данные получены"
}
Пример ответа в PHP
header("Content-Type: application/json");
echo json_encode(["status" => "success", "message" => "Данные получены"]);
🟠XML – используется в старых системах Пример XML-ответа
<response>
    <status>success</status>
    <message>Данные получены</message>
</response>
🟠HTML – если сервер возвращает веб-страницу Например, при загрузке сайта.
echo "<h1>Привет, мир!</h1>";
🟠Текстовый формат (Plain Text) Если нужен простой текст
header("Content-Type: text/plain");
echo "Привет, это просто текст!";
🚩Как сервер определяет формат ответа? Сервер анализирует заголовок Accept в запросе:
Accept: application/json
PHP может обработать это так:
$accept = $_SERVER['HTTP_ACCEPT'];
if (strpos($accept, "application/json") !== false) {
    header("Content-Type: application/json");
    echo json_encode(["message" => "Привет, JSON!"]);
} else {
    echo "Привет, обычный текст!";
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Принципы ООП Основные принципы объектно-ориентированного программирования включают инкапсуляцию (сокрытие деталей реализации), наследование (использование общих свойств и поведения базовых классов), полиморфизм (один интерфейс для разных типов данных) и абстракцию (определение шаблонного интерфейса для группы связанных объектов).? Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем заключается обработка ошибок и исключений? Обработка ошибок в PHP – это механизм, который помогает находить, интерпретировать и корректно реагировать на ошибки во время выполнения программы. Для этого в PHP используются два подхода: Традиционные ошибки (error_reporting, set_error_handler) *Исключения (try-catch, throw) 🟠Традиционная обработка ошибок PHP изначально использовал механизм ошибок, которые делятся на несколько типов: E_ERROR – фатальная ошибка, завершает выполнение скрипта. E_WARNING – предупреждение, но скрипт продолжает выполняться. E_NOTICE – уведомление о потенциальной проблеме.
echo $undefined_var; // E_NOTICE: Undefined variable
🚩Способы обработки ошибок 🟠error_reporting() – управление уровнем ошибок Функция error_reporting() позволяет включать или выключать определённые типы ошибок.
error_reporting(E_ALL & ~E_NOTICE); // Показывать все ошибки, кроме E_NOTICE
🟠set_error_handler() – создание пользовательского обработчика ошибок Можно задать свою функцию, которая будет реагировать на ошибки.
function myErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "Ошибка [$errno]: $errstr в файле $errfile на строке $errline";
}
set_error_handler("myErrorHandler");

// Вызовем ошибку
echo 10 / 0; // Division by zero (E_WARNING)
🟠error_log() – запись ошибок в файл Ошибки можно не выводить на экран, а записывать в файл.
error_log("Ошибка: что-то пошло не так!", 3, "errors.log");
🚩Исключения (`try-catch`) С версии PHP 5 появился механизм исключений, который более удобен и структурирован. Исключения позволяют: Перехватывать ошибки и управлять их обработкой. Использовать вложенные блоки try-catch для детальной обработки. Создавать собственные классы исключений.
try {
    if (!file_exists("somefile.txt")) {
        throw new Exception("Файл не найден");
    }
} catch (Exception $e) {
    echo "Ошибка: " . $e->getMessage();
}
🟠Классы исключений PHP позволяет использовать предопределённый класс Exception, а также создавать свои.
class MyException extends Exception {}

try {
    throw new MyException("Это моя ошибка");
} catch (MyException $e) {
    echo "Поймано исключение: " . $e->getMessage();
}
🟠Блок `finally` Используется для выполнения кода в любом случае – независимо от того, было исключение или нет.
try {
    echo "Попытка выполнить код\n";
} catch (Exception $e) {
    echo "Ошибка поймана\n";
} finally {
    echo "Этот код выполнится в любом случае\n";
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чём преимущество hash-индекса и btree-индекса? 1. Hash-индекс: • Быстрый доступ для равенств (=) и точных запросов. • Не подходит для диапазонных запросов. 2. B-Tree индекс: • Оптимален для диапазонных запросов и сортировки. • Поддерживает равенства и сравнения (<, >). • Медленнее hash-индекса для точного поиска. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Слово "global" для чего используется? Ключевое слово global используется в PHP для доступа к глобальным переменным внутри функций. 🚩Как работает `global`? Доступ к глобальной переменной внутри функции
$counter = 10; // Глобальная переменная

function increment() {
    global $counter; // Доступ к глобальной переменной
    $counter++;
}

increment();
echo $counter; // ✅ 11
Использование нескольких глобальных переменных
$a = 5;
$b = 10;

function sum() {
    global $a, $b;
    $b = $a + $b; // Меняем глобальную переменную $b
}

sum();
echo $b; // ✅ 15
🟠Альтернативный способ – `$GLOBALS` Можно использовать суперглобальный массив $GLOBALS, который хранит все глобальные переменные.
$x = 3;
$y = 7;

function multiply() {
    $GLOBALS['y'] = $GLOBALS['x'] * $GLOBALS['y'];
}

multiply();
echo $y; // ✅ 21
🚩Когда `global` – плохая идея? Глобальные переменные усложняют отладку (их можно случайно изменить). Функции становятся зависимыми от внешних данных (плохо для тестирования). Лучше передавать переменные через аргументы функции. Альтернативный способ (без global)
function increment($counter) {
    return $counter + 1;
}

$counter = 10;
$counter = increment($counter);
echo $counter; // ✅ 11
Ставь 👍 и забирай 📚 Базу знаний