Skip to content

Instantly share code, notes, and snippets.

@c80609a
Created May 7, 2025 15:38
Show Gist options
  • Save c80609a/fc109272599bc6f8b8194f7be370592a to your computer and use it in GitHub Desktop.
Save c80609a/fc109272599bc6f8b8194f7be370592a to your computer and use it in GitHub Desktop.
php_decorator.md

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

Пример с использованием функций

<?php
function decorator($function) {
    return function() use ($function) {
        echo "Before function call\n";
        $function();
        echo "After function call\n";
    };
}

function sayHello() {
    echo "Hello, World!\n";
}

$decoratedFunction = decorator('sayHello');
$decoratedFunction();
?>

Пример с использованием классов

<?php
class Decorator {
    private $function;

    public function __construct(callable $function) {
        $this->function = $function;
    }

    public function __invoke() {
        echo "Before function call\n";
        call_user_func($this->function);
        echo "After function call\n";
    }
}

function sayHello() {
    echo "Hello, World!\n";
}

$decoratedFunction = new Decorator('sayHello');
$decoratedFunction();
?>

В обоих примерах функция sayHello оборачивается декоратором, который добавляет вывод текста до и после вызова основной функции. Это позволяет добавлять дополнительное поведение к функциям без изменения их кода.

@c80609a
Copy link
Author

c80609a commented May 7, 2025

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

  1. Middleware: Особенно в контексте веб-приложений, таких как те, что работают на фреймворках Laravel или Symfony. Middleware позволяет оборачивать запросы и добавлять функциональность, такую как аутентификация или логирование.

  2. Аспектно-ориентированное программирование (AOP): Хотя это не так распространено, как в некоторых других языках, существуют библиотеки, которые позволяют внедрять аспекты в код, добавляя кросс-секционные функциональности.

  3. Использование трейтов: Трейты позволяют добавлять методы в классы, что может быть полезно для повторного использования кода.

  4. События и слушатели: Многие фреймворки поддерживают событийную модель, где можно подписываться на события и выполнять код в ответ на них.

  5. Паттерн проектирования "Декоратор": Это структурный паттерн, который позволяет динамически добавлять новое поведение объектам, оборачивая их в "декораторы". Это может быть реализовано через классы и интерфейсы.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment