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();

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.70.0120.00818.55
8.3.60.0150.00616.75
8.3.50.0100.01018.17
8.3.40.0100.00718.76
8.3.30.0110.00418.78
8.3.20.0040.00424.18
8.3.10.0080.00024.66
8.3.00.0040.00426.16
8.2.180.0110.01125.92
8.2.170.0140.00418.84
8.2.160.0140.00022.96
8.2.150.0040.00425.66
8.2.140.0080.00024.66
8.2.130.0030.00526.16
8.2.120.0070.00021.05
8.2.110.0100.00020.30
8.2.100.0030.00720.70
8.1.280.0120.00625.92
8.1.270.0050.00323.99
8.1.260.0040.00426.35
8.1.250.0040.00428.09
8.1.240.0030.00620.33
8.1.230.0030.00622.13
8.0.90.0030.00516.98

preferences:
45.57 ms | 401 KiB | 5 Q