3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\Command\Conceptual; /** * Интерфейс Команды объявляет метод для выполнения команд. */ interface Command { public function execute(): void; } /** * Некоторые команды способны выполнять простые операции самостоятельно. */ class SimpleCommand implements Command { private $payload; public function __construct(string $payload) { $this->payload = $payload; } public function execute(): void { echo "SimpleCommand: See, I can do simple things like printing (" . $this->payload . ")\n"; } } /** * Но есть и команды, которые делегируют более сложные операции другим объектам, * называемым «получателями». */ class ComplexCommand implements Command { /** * @var Receiver */ private $receiver; /** * Данные о контексте, необходимые для запуска методов получателя. */ private $a; private $b; /** * Сложные команды могут принимать один или несколько объектов-получателей * вместе с любыми данными о контексте через конструктор. */ public function __construct(Receiver $receiver, string $a, string $b) { $this->receiver = $receiver; $this->a = $a; $this->b = $b; } /** * Команды могут делегировать выполнение любым методам получателя. */ public function execute(): void { echo "ComplexCommand: Complex stuff should be done by a receiver object.\n"; $this->receiver->doSomething($this->a); $this->receiver->doSomethingElse($this->b); } } /** * Классы Получателей содержат некую важную бизнес-логику. Они умеют выполнять * все виды операций, связанных с выполнением запроса. Фактически, любой класс * может выступать Получателем. */ class Receiver { public function doSomething(string $a): void { echo "Receiver: Working on (" . $a . ".)\n"; } public function doSomethingElse(string $b): void { echo "Receiver: Also working on (" . $b . ".)\n"; } } /** * Отправитель связан с одной или несколькими командами. Он отправляет запрос * команде. */ class Invoker { /** * @var Command */ private $onStart; /** * @var Command */ private $onFinish; /** * Инициализация команд. */ public function setOnStart(Command $command): void { $this->onStart = $command; } public function setOnFinish(Command $command): void { $this->onFinish = $command; } /** * Отправитель не зависит от классов конкретных команд и получателей. * Отправитель передаёт запрос получателю косвенно, выполняя команду. */ public function doSomethingImportant(): void { echo "Invoker: Does anybody want something done before I begin?\n"; if ($this->onStart instanceof Command) { $this->onStart->execute(); } echo "Invoker: ...doing something really important...\n"; echo "Invoker: Does anybody want something done after I finish?\n"; if ($this->onFinish instanceof Command) { $this->onFinish->execute(); } } } /** * Клиентский код может параметризовать отправителя любыми командами. */ $invoker = new Invoker(); $invoker->setOnStart(new SimpleCommand("Say Hi!")); $receiver = new Receiver(); $invoker->setOnFinish(new ComplexCommand($receiver, "Send email", "Save report")); $invoker->doSomethingImportant();
Output for 8.0.9
Invoker: Does anybody want something done before I begin? SimpleCommand: See, I can do simple things like printing (Say Hi!) Invoker: ...doing something really important... Invoker: Does anybody want something done after I finish? ComplexCommand: Complex stuff should be done by a receiver object. Receiver: Working on (Send email.) Receiver: Also working on (Save report.)

preferences:
19.34 ms | 409 KiB | 5 Q