3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\Prototype\Conceptual; /** * Пример класса, имеющего возможность клонирования. Мы посмотрим как происходит * клонирование значений полей разных типов. */ class Prototype { public $primitive; public $component; public $circularReference; /** * PHP имеет встроенную поддержку клонирования. Вы можете «клонировать» * объект без определения каких-либо специальных методов, при условии, что * его поля имеют примитивные типы. Поля, содержащие объекты, сохраняют свои * ссылки в клонированном объекте. Поэтому в некоторых случаях вам может * понадобиться клонировать также и вложенные объекты. Это можно сделать * специальным методом clone. */ public function __clone() { $this->component = clone $this->component; // Клонирование объекта, который имеет вложенный объект с обратной // ссылкой, требует специального подхода. После завершения клонирования // вложенный объект должен указывать на клонированный объект, а не на // исходный объект. $this->circularReference = clone $this->circularReference; $this->circularReference->prototype = $this; } } class ComponentWithBackReference { public $prototype; /** * Обратите внимание, что конструктор не будет выполнен во время * клонирования. Если у вас сложная логика внутри конструктора, вам может * потребоваться выполнить ее также и в методе clone. */ public function __construct(Prototype $prototype) { $this->prototype = $prototype; } } /** * Клиентский код. */ function clientCode() { $p1 = new Prototype(); $p1->primitive = 245; $p1->component = new \DateTime(); $p1->circularReference = new ComponentWithBackReference($p1); $p2 = clone $p1; if ($p1->primitive === $p2->primitive) { echo "Primitive field values have been carried over to a clone. Yay!\n"; } else { echo "Primitive field values have not been copied. Booo!\n"; } if ($p1->component === $p2->component) { echo "Simple component has not been cloned. Booo!\n"; } else { echo "Simple component has been cloned. Yay!\n"; } if ($p1->circularReference === $p2->circularReference) { echo "Component with back reference has not been cloned. Booo!\n"; } else { echo "Component with back reference has been cloned. Yay!\n"; } if ($p1->circularReference->prototype === $p2->circularReference->prototype) { echo "Component with back reference is linked to original object. Booo!\n"; } else { echo "Component with back reference is linked to the clone. Yay!\n"; } } clientCode();

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.60.0140.00716.63
8.3.50.0140.00018.45
8.3.40.0070.01119.08
8.3.30.0080.01218.96
8.3.20.0030.00624.18
8.3.10.0030.00624.66
8.3.00.0050.00326.16
8.2.180.0120.00325.92
8.2.170.0110.00718.91
8.2.160.0030.01022.96
8.2.150.0050.00325.66
8.2.140.0000.00824.66
8.2.130.0000.00826.16
8.2.120.0080.00026.16
8.2.110.0070.00322.08
8.2.100.0040.00819.45
8.2.90.0040.00417.88
8.2.80.0080.00019.05
8.2.70.0000.00917.88
8.2.60.0050.00317.93
8.2.50.0080.00018.05
8.2.40.0040.00418.30
8.2.30.0040.00418.04
8.2.20.0080.00018.07
8.2.10.0050.00219.31
8.2.00.0050.00219.32
8.1.280.0100.00325.92
8.1.270.0070.00023.99
8.1.260.0050.00326.35
8.1.250.0040.00428.09
8.1.240.0100.00021.09
8.1.230.0110.00017.78
8.1.220.0000.00817.74
8.1.210.0040.00418.77
8.1.200.0000.00917.60
8.1.190.0090.00017.35
8.1.180.0050.00518.10
8.1.170.0080.00018.71
8.1.160.0050.00319.02
8.1.150.0050.00318.91
8.1.140.0040.00419.01
8.1.130.0000.00717.47
8.1.120.0080.00017.60
8.1.110.0030.00517.63
8.1.100.0000.01017.64
8.1.90.0000.00717.63
8.1.80.0060.00317.61
8.1.70.0050.00217.58
8.1.60.0090.00317.73
8.1.50.0080.00017.61
8.1.40.0020.00517.56
8.1.30.0030.00517.71
8.1.20.0030.00517.62
8.1.10.0060.00317.63
8.1.00.0080.00017.70
8.0.300.0000.00818.77
8.0.290.0060.00317.00
8.0.280.0000.00718.63
8.0.270.0050.00218.20
8.0.260.0040.00417.10
8.0.250.0000.00717.14
8.0.240.0040.00417.18
8.0.230.0000.00817.12
8.0.220.0030.00317.07
8.0.210.0080.00017.08
8.0.200.0050.00317.17
8.0.190.0080.00017.13
8.0.180.0050.00217.02
8.0.170.0040.00417.11
8.0.160.0080.00017.16
8.0.150.0040.00417.07
8.0.140.0030.00517.00
8.0.130.0050.00013.53
8.0.120.0000.00817.09
8.0.110.0040.00417.06
8.0.100.0080.00017.03
8.0.90.0050.00316.97
8.0.80.0060.01417.06
8.0.70.0040.00416.88
8.0.60.0040.00416.98
8.0.50.0040.00417.08
8.0.30.0190.01216.96
8.0.20.0280.01217.09
8.0.10.0280.00617.25
8.0.00.0240.01017.09
7.4.330.0000.00515.55
7.4.320.0050.00316.76
7.4.300.0040.00416.74
7.4.290.0000.00916.63
7.4.280.0030.00616.70
7.4.270.0000.00716.52
7.4.260.0000.00613.35
7.4.250.0030.00316.73
7.4.240.0040.00416.68
7.4.230.0000.00716.63
7.4.220.0090.00016.52
7.4.210.0090.00816.64
7.4.200.0030.00316.45
7.4.160.0230.01116.58
7.4.150.0260.01016.49
7.4.140.0170.01716.58
7.4.130.0190.01016.56
7.4.120.0290.01716.50
7.4.110.0330.00316.50
7.4.100.0200.00916.62
7.4.90.0200.01116.70
7.4.80.0250.01116.49
7.4.70.0200.00716.57
7.4.60.0240.01016.56
7.4.50.0150.01516.57
7.4.40.0310.00016.51
7.4.30.0220.00616.67
7.4.20.0180.01216.74
7.4.10.0100.01916.45
7.4.00.0220.01116.62
7.3.330.0030.00316.57
7.3.320.0000.00613.27
7.3.310.0000.00716.50
7.3.300.0030.00316.47
7.3.290.0090.00916.49
7.3.280.0170.01716.32
7.3.270.0260.01016.41
7.3.260.0320.00416.32
7.3.250.0210.01016.39
7.3.240.0250.00716.43
7.3.230.0150.01516.25
7.3.220.0220.00716.43
7.3.210.0320.00316.38
7.3.200.0280.00416.48
7.3.190.0330.00616.42
7.3.180.0210.01216.41
7.3.170.0190.01116.43
7.3.160.0320.00016.52
7.3.150.0280.00616.49
7.3.140.0260.00316.46
7.3.130.0210.01316.52
7.3.120.0140.01816.34
7.3.110.0190.01316.32
7.3.100.0290.00616.30
7.3.90.0240.00816.60
7.3.80.0270.01116.32
7.3.70.0230.01116.47
7.3.60.0140.01416.63
7.3.50.0250.01016.64
7.3.40.0260.00716.55
7.3.30.0300.00916.54
7.3.20.0300.00716.62
7.3.10.0140.01416.54
7.3.00.0200.01416.51

preferences:
70.54 ms | 401 KiB | 5 Q