3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\Proxy\Conceptual; /** * Интерфейс Субъекта объявляет общие операции как для Реального Субъекта, так и * для Заместителя. Пока клиент работает с Реальным Субъектом, используя этот * интерфейс, вы сможете передать ему заместителя вместо реального субъекта. */ interface Subject { public function request(): void; } /** * Реальный Субъект содержит некоторую базовую бизнес-логику. Как правило, * Реальные Субъекты способны выполнять некоторую полезную работу, которая к * тому же может быть очень медленной или точной – например, коррекция входных * данных. Заместитель может решить эти задачи без каких-либо изменений в коде * Реального Субъекта. */ class RealSubject implements Subject { public function request(): void { echo "RealSubject: Handling request.\n"; } } /** * Интерфейс Заместителя идентичен интерфейсу Реального Субъекта. */ class Proxy implements Subject { /** * @var RealSubject */ private $realSubject; /** * Заместитель хранит ссылку на объект класса РеальныйСубъект. Клиент может * либо лениво загрузить его, либо передать Заместителю. */ public function __construct(RealSubject $realSubject) { $this->realSubject = $realSubject; } /** * Наиболее распространёнными областями применения паттерна Заместитель * являются ленивая загрузка, кэширование, контроль доступа, ведение журнала * и т.д. Заместитель может выполнить одну из этих задач, а затем, в * зависимости от результата, передать выполнение одноимённому методу в * связанном объекте класса Реального Субъект. */ public function request(): void { if ($this->checkAccess()) { $this->realSubject->request(); $this->logAccess(); } } private function checkAccess(): bool { // Некоторые реальные проверки должны проходить здесь. echo "Proxy: Checking access prior to firing a real request.\n"; return true; } private function logAccess(): void { echo "Proxy: Logging the time of request.\n"; } } /** * Клиентский код должен работать со всеми объектами (как с реальными, так и * заместителями) через интерфейс Субъекта, чтобы поддерживать как реальные * субъекты, так и заместителей. В реальной жизни, однако, клиенты в основном * работают с реальными субъектами напрямую. В этом случае, для более простой * реализации паттерна, можно расширить заместителя из класса реального * субъекта. */ function clientCode(Subject $subject) { // ... $subject->request(); // ... } echo "Client: Executing the client code with a real subject:\n"; $realSubject = new RealSubject(); clientCode($realSubject); echo "\n"; echo "Client: Executing the same client code with a proxy:\n"; $proxy = new Proxy($realSubject); clientCode($proxy);

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.5.10.0100.00916.73
8.5.00.0150.00719.93
8.4.160.0110.01023.09
8.4.150.0030.00014.05
8.4.140.0130.00817.54
8.4.130.0050.00417.84
8.4.120.0100.01020.55
8.4.110.0120.00822.57
8.4.100.0160.00517.75
8.4.90.0150.00618.79
8.4.80.0110.00917.75
8.4.70.0130.00817.84
8.4.60.0150.00718.57
8.4.50.0110.00817.53
8.4.40.0040.00717.43
8.4.30.0050.00320.61
8.4.20.0110.01120.61
8.4.10.0040.00419.51
8.3.280.0090.01118.43
8.3.270.0100.00916.69
8.3.260.0130.00816.89
8.3.250.0100.00818.75
8.3.240.0140.00516.59
8.3.230.0100.00916.51
8.3.220.0080.00817.25
8.3.210.0120.00716.57
8.3.200.0070.00216.59
8.3.190.0050.00317.38
8.3.180.0060.01216.74
8.3.170.0080.00520.59
8.3.160.0120.00616.54
8.3.150.0070.01017.10
8.3.140.0030.00516.83
8.3.130.0030.00618.49
8.3.120.0110.00018.93
8.3.110.0110.00020.94
8.3.100.0090.00916.61
8.3.90.0040.00426.77
8.3.80.0090.00016.75
8.3.70.0040.01116.58
8.3.60.0060.01218.18
8.3.50.0100.00720.09
8.3.40.0120.00318.66
8.3.30.0040.01118.75
8.3.20.0040.00424.18
8.3.10.0030.00524.66
8.3.00.0040.00426.16
8.2.290.0100.00920.38
8.2.280.0040.00522.09
8.2.270.0050.01417.30
8.2.260.0080.00018.96
8.2.250.0030.01718.60
8.2.240.0040.00419.21
8.2.230.0060.00322.58
8.2.220.0040.00424.06
8.2.210.0030.00626.77
8.2.200.0000.00816.75
8.2.190.0070.00716.58
8.2.180.0160.00625.92
8.2.170.0060.00918.83
8.2.160.0100.00322.96
8.2.150.0040.00425.66
8.2.140.0040.00424.66
8.2.130.0050.00326.16
8.2.120.0040.00426.16
8.2.110.0100.00020.52
8.2.100.0100.00018.97
8.1.330.0130.00622.02
8.1.320.0110.00916.17
8.1.310.0000.00818.60
8.1.300.0030.00618.15
8.1.290.0030.00630.84
8.1.280.0140.00425.92
8.1.270.0030.00622.13
8.1.260.0050.00326.35
8.1.250.0070.00428.09
8.1.240.0030.00618.91
8.1.230.0060.00320.45
8.0.90.0000.00816.95

preferences:
92.93 ms | 403 KiB | 5 Q