3v4l.org

run code in 300+ PHP versions simultaneously
<?php abstract class Number { abstract public function primitive(): mixed; abstract public function add(Number $other): Number; abstract protected function addIntNumber(IntNumber $other): Number; abstract protected function addFloatNumber(FloatNumber $other): Number; public static function from(int|float $primitive): Number { return match (true) { is_int($primitive) => new IntNumber($primitive), is_float($primitive) => new FloatNumber($primitive), default => throw new InvalidArgumentException('blah blah'), }; } } class IntNumber extends Number { public function __construct( private int $value ) {} public function primitive(): int { return $this->value; } public function add(Number $other): Number { return $other->addIntNumber($this); } protected function addIntNumber(IntNumber $other): IntNumber { return new IntNumber($this->primitive() + $other->primitive()); } protected function addFloatNumber(FloatNumber $other): FloatNumber { return new FloatNumber((float) $this->primitive() + $other->primitive()); } } class FloatNumber extends Number { public function __construct( private float $value ) {} public function primitive(): float { return $this->value; } public function add(Number $other): Number { return $other->addFloatNumber($this); } protected function addIntNumber(IntNumber $other): FloatNumber { return new FloatNumber($this->primitive() + (float) $other->primitive()); } protected function addFloatNumber(FloatNumber $other): FloatNumber { return new FloatNumber($this->primitive() + $other->primitive()); } } $primitives = [1, 2, 7.13, 5.012]; $numbers = array_map([Number::class, 'from'], $primitives); $carry = new IntNumber(0); foreach ($numbers as $number) { $carry = $carry->add($number); echo '$number: ', get_class($number), ' ', $number->primitive(), PHP_EOL; echo '$carry: ', get_class($carry), ' ', $carry->primitive(), PHP_EOL; echo PHP_EOL; }

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.4.140.0150.01317.77
8.4.130.0370.01017.55
8.4.120.0410.01017.60
8.4.110.0350.00917.76
8.4.100.0380.00918.05
8.4.90.0390.01117.63
8.4.80.0340.01117.68
8.4.70.0340.00618.04
8.4.60.0330.01117.40
8.4.50.0290.00917.56
8.4.40.0200.00517.74
8.4.30.0220.00217.37
8.4.20.0290.00217.13
8.4.10.0330.01017.22
8.3.260.0380.00516.64
8.3.250.0350.00816.86
8.3.240.0270.00516.45
8.3.230.0310.00516.58
8.3.220.0180.00416.86
8.3.210.0310.00816.47
8.3.200.0370.00916.53
8.3.190.0380.00916.54
8.3.180.0420.00916.53
8.3.170.0370.00116.62
8.3.160.0150.00716.54
8.3.150.0180.00416.41
8.3.140.0180.00616.45
8.3.130.0260.00916.64
8.3.120.0380.00616.55
8.3.110.0450.00916.57
8.3.100.0410.00916.55
8.3.90.0440.00716.51
8.3.80.0550.00616.55
8.3.70.0240.00416.70
8.3.60.0420.01016.52
8.3.50.0400.00916.34
8.3.40.0390.01117.61
8.3.30.0300.01017.80
8.3.20.0360.00617.64
8.3.10.0290.00617.39
8.3.00.0300.00317.39
8.2.290.0340.00516.43
8.2.280.0320.00516.63
8.2.270.0380.00516.40
8.2.260.0320.00716.44
8.2.250.0110.00816.83
8.2.240.0310.00916.48
8.2.230.0230.00416.55
8.2.220.0210.00516.45
8.2.210.0160.00316.63
8.2.200.0150.01116.42
8.2.190.0180.00416.68
8.2.180.0160.00316.73
8.2.170.0180.00417.91
8.2.160.0390.00817.75
8.2.150.0380.00817.62
8.2.140.0270.00517.54
8.2.130.0220.00317.43
8.2.120.0190.00517.54
8.2.110.0200.00717.80
8.2.100.0160.00817.64
8.2.90.0330.00417.28
8.2.80.0360.00917.42
8.2.70.0380.00817.39
8.2.60.0350.00917.76
8.2.50.0420.01017.57
8.2.40.0280.01217.46
8.2.30.0330.00617.67
8.2.20.0370.00417.36
8.2.10.0330.00817.63
8.2.00.0310.00617.55

preferences:
34.25 ms | 403 KiB | 5 Q