3v4l.org

run code in 300+ PHP versions simultaneously
<?php error_reporting(-1); class Slot { /** * @var callable */ public $listener; /** * @var boolean */ public $once; /** @var array */ public $params = array(); /** * @var Signal */ private $signal; function __construct(Signal $signal, $listener, $once) { $this->listener = $listener; $this->once = $once; $this->signal = $signal; } public function execute(array $values) { $resolver = $this->signal->getListenerResolver(); if ($resolver) { $callback = $resolver->resolve($this->listener); } else { $callback = $this->listener; } $args = array_merge($values, $this->params); return call_user_func_array($callback, $args); } public function getListener() { return $this->listener; } public function getOnce() { return $this->once; } } class SlotList { /** * @var Signal */ private $signal; /** * @var Slot[] */ private $slots = array(); function __construct(Signal $signal) { $this->signal = $signal; } public function add(Slot $slot) { return $this->slots[] = $slot; } public function count() { return count($this->slots); } public function execute(array $values) { $returnResultMatcher = $this->signal->getReturnResultMatcher(); foreach ($this->slots as $key => $slot) { if ($slot->once) { unset($this->slots[$key]); } $result = $slot->execute($values); if ($returnResultMatcher && $returnResultMatcher->match($result)) { return $result; } } } /** * @param callable $listener * @return Slot */ public function find($listener) { foreach ($this->slots as $slot) { if ($slot->listener === $listener) { return $slot; } } } /** * @param callable $listener * @return Slot */ public function remove($listener) { foreach ($this->slots as $key => $slot) { if ($slot->listener === $listener) { unset($this->slots[$key]); return $slot; } } } } interface ListenerResolverInterface { public function resolve($listener); } interface ListenerResolverAwareInterface { public function getListenerResolver(); public function setListenerResolver(ListenerResolverInterface $listenerResolver); } class SimpleListenerResolver implements ListenerResolverInterface { public function resolve($listener) { if (is_array($listener)) { list($class, $method) = $listener; } else if (is_string($listener) && strpos($listener, '::')) { list($class, $method) = explode('::', $listener); } if (isset($class) && !is_object($class)) { return array(new $class, $method); } return $listener; } } interface ReturnResultMatcherInterface { public function match($result); } interface ReturnResultMatcherAwareInterface { public function getReturnResultMatcher(); public function setReturnResultMatcher(ReturnResultMatcherInterface $returnResultMatcher); } class NonNullReturnResultMatcher implements ReturnResultMatcherInterface { public function match($result) { return $result !== null; } } interface OnceSignalInterface { public function addOnce($listener); public function dispatch(); public function getNumListeners(); public function remove($listener); } interface SignalInterface { public function add($listener); } abstract class AbstractOnceSignal implements OnceSignalInterface { protected $slots; public function addOnce($listener) { return $this->register($listener, true); } public function dispatch() { if (count($this->slots) < 1) { return; } $values = func_get_args(); return $this->execute($values); } public function getNumListeners() { return count($this->slots); } abstract protected function register($listener, $once); abstract protected function execute(array $values); } class OnceSignal extends AbstractOnceSignal implements ListenerResolverAwareInterface, ReturnResultMatcherAwareInterface { /** @var ListenerResolverInterface */ protected $listenerResolver; /** @var ReturnResultMatcherInterface */ protected $returnResultMatcher; /** @var mixed */ private $owner; /** * @var array */ private $valueTypes; function __construct(array $valueTypes = array(), $owner = null) { $this->valueTypes = $valueTypes; $this->owner = $owner; $this->slots = new SlotList($this); } public function addOnce($listener) { return $this->register($listener, true); } public function getNumListeners() { return $this->slots->count(); } public function getListenerResolver() { return $this->listenerResolver; } public function setListenerResolver(ListenerResolverInterface $listenerResolver) { $this->listenerResolver = $listenerResolver; } public function getReturnResultMatcher() { return $this->returnResultMatcher; } public function setReturnResultMatcher(ReturnResultMatcherInterface $returnResultMatcher) { $this->returnResultMatcher = $returnResultMatcher; } protected function execute(array $values) { // validate value types if (isset($this->owner)) { $values[] = $this->owner; } if (empty($this->listenerResolver)) { $this->setListenerResolver(new SimpleListenerResolver()); } return $this->slots->execute($values); } protected function register($listener, $once) { $existing = $this->slots->find($listener); if ($existing) { if ($existing->once !== $once) { throw new InvalidArgumentException('Once not once!'); } return $existing; } return $this->slots->add(new Slot($this, $listener, $once)); } public function remove($listener) { return $this->slots->remove($listener); } } class Signal extends OnceSignal implements SignalInterface { public function add($listener) { return $this->register($listener, false); } } class MinimalSignal extends AbstractOnceSignal implements SignalInterface { public function __construct() { $this->slots = array(); } public function add($listener) { $this->register($listener, false); } protected function execute(array $values) { foreach ($this->slots as $key => $slot) { if ($slot[1]) { unset($this->slots[$key]); } call_user_func_array($slot[0], $values); } } protected function register($listener, $once) { foreach ($this->slots as $slot) { if ($slot[0] === $listener) { if ($slot[1] !== $once) { throw new InvalidArgumentException('Once not once!'); } return; } } $this->slots[] = array($listener, $once); } public function remove($listener) { foreach ($this->slots as $key => $slot) { if ($slot[0] === $listener) { unset($this->slots[$key]); return; } } } } echo "<pre>"; class MyListener { public function onSignal(MySignalOwner $owner) { die('<pre>' . print_r($owner, 1) . __FILE__ . ' : ' . __LINE__ . "\n"); } } class MySignalOwner { /** * @var Signal */ private $signal; /** * @return Signal */ public function getSignal() { return $this->signal ? $this->signal : $this->signal = new Signal(array(), $this); } } $listener = 'MyListener::onSignal'; $listener = array(new MyListener, 'onSignal'); $owner = new MySignalOwner(); $owner->getSignal()->addOnce($listener); $result = $owner->getSignal()->dispatch();

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.0150.00316.75
8.3.50.0070.00922.00
8.3.40.0160.00619.01
8.3.30.0120.00319.24
8.3.20.0050.00320.46
8.3.10.0040.00423.57
8.3.00.0060.00319.38
8.2.180.0120.00918.41
8.2.170.0120.00322.96
8.2.160.0070.00720.64
8.2.150.0040.00424.18
8.2.140.0060.00324.66
8.2.130.0070.01126.16
8.2.120.0080.00022.25
8.2.110.0060.00320.62
8.2.100.0090.00318.16
8.2.90.0050.00518.28
8.2.80.0040.00417.97
8.2.70.0030.00617.75
8.2.60.0060.00318.17
8.2.50.0080.00018.07
8.2.40.0060.00318.41
8.2.30.0060.00318.24
8.2.20.0000.00817.90
8.2.10.0040.00418.11
8.2.00.0080.00317.87
8.1.280.0070.00725.92
8.1.270.0080.00023.84
8.1.260.0060.00326.35
8.1.250.0030.00528.09
8.1.240.0130.00020.98
8.1.230.0080.00321.21
8.1.220.0040.00417.91
8.1.210.0040.00419.02
8.1.200.0040.00417.48
8.1.190.0000.00917.66
8.1.180.0060.00319.26
8.1.170.0030.00518.83
8.1.160.0000.00722.07
8.1.150.0040.00418.79
8.1.140.0030.00617.46
8.1.130.0070.00017.91
8.1.120.0000.01017.57
8.1.110.0040.00717.61
8.1.100.0050.00317.50
8.1.90.0080.00017.61
8.1.80.0000.00817.56
8.1.70.0000.00717.51
8.1.60.0040.00417.73
8.1.50.0060.00317.62
8.1.40.0000.00817.63
8.1.30.0000.00817.77
8.1.20.0050.00317.66
8.1.10.0030.00717.56
8.1.00.0030.00517.64
8.0.300.0030.00620.17
8.0.290.0000.00717.16
8.0.280.0000.00718.59
8.0.270.0070.00017.36
8.0.260.0030.00317.41
8.0.250.0040.00417.14
8.0.240.0030.00317.14
8.0.230.0040.00416.99
8.0.220.0030.00617.08
8.0.210.0000.00716.97
8.0.200.0000.00717.12
8.0.190.0080.00017.08
8.0.180.0080.00017.14
8.0.170.0020.00517.11
8.0.160.0000.00816.95
8.0.150.0000.00816.95
8.0.140.0040.00417.05
8.0.130.0000.00613.46
8.0.120.0050.00316.99
8.0.110.0080.00016.96
8.0.100.0080.00017.04
8.0.90.0040.00416.93
8.0.80.0060.00917.01
8.0.70.0070.00017.01
8.0.60.0080.00016.94
8.0.50.0040.00417.06
8.0.30.0110.00917.39
8.0.20.0130.00917.40
8.0.10.0060.00317.07
8.0.00.0130.00616.94
7.4.330.0000.00515.00
7.4.320.0000.00616.72
7.4.300.0040.00416.75
7.4.290.0060.00616.71
7.4.280.0040.00416.61
7.4.270.0020.00516.62
7.4.260.0000.00716.50
7.4.250.0040.00416.68
7.4.240.0010.00616.67
7.4.230.0040.00416.46
7.4.220.0060.01016.64
7.4.210.0070.00816.57
7.4.200.0000.00716.64
7.4.190.0050.00216.77
7.4.160.0040.01516.62
7.4.150.0090.00917.40
7.4.140.0090.00917.86
7.4.130.0100.00716.53
7.4.120.0090.00916.60
7.4.110.0070.01116.71
7.4.100.0030.01916.66
7.4.90.0060.01316.63
7.4.80.0120.00919.39
7.4.70.0070.01016.49
7.4.60.0160.00616.55
7.4.50.0030.00616.66
7.4.40.0100.00322.77
7.4.30.0100.00716.64
7.4.10.0060.01014.88
7.4.00.0060.01215.13
7.3.330.0000.00613.52
7.3.320.0030.00313.57
7.3.310.0040.00416.57
7.3.300.0070.00016.45
7.3.290.0110.00916.50
7.3.280.0070.01016.55
7.3.270.0090.00917.40
7.3.260.0080.01216.73
7.3.250.0100.01016.53
7.3.240.0110.01116.45
7.3.230.0070.01016.54
7.3.210.0100.01316.68
7.3.200.0130.01019.39
7.3.190.0150.00316.58
7.3.180.0140.00316.50
7.3.170.0030.01316.55
7.3.160.0130.00316.54
7.3.130.0100.01014.69
7.3.120.0060.00914.87
7.3.110.0060.01215.01
7.3.100.0090.00514.88
7.3.90.0080.00514.89
7.3.80.0000.01615.08
7.3.70.0050.00714.81
7.3.60.0110.00514.91
7.3.50.0050.00714.87
7.3.40.0070.00515.07
7.3.30.0070.00514.79
7.3.20.0030.00816.54
7.3.10.0030.01216.71
7.3.00.0020.00916.66
7.2.330.0100.00916.94
7.2.320.0070.01416.98
7.2.310.0030.01416.75
7.2.300.0110.00616.87
7.2.290.0070.01016.76
7.2.260.0110.01115.09
7.2.250.0080.01115.22
7.2.240.0070.01015.24
7.2.230.0030.01215.09
7.2.220.0050.01015.11
7.2.210.0050.01115.30
7.2.200.0040.00815.27
7.2.190.0040.01015.13
7.2.180.0020.01215.14
7.2.170.0050.01215.27
7.2.160.0000.01415.27
7.2.150.0070.00716.96
7.2.140.0070.00716.90
7.2.130.0030.01016.84
7.2.120.0070.01016.98
7.2.110.0070.00716.87
7.2.100.0090.00616.65
7.2.90.0070.00716.93
7.2.80.0030.01316.85
7.2.70.0090.00616.77
7.2.60.0060.00817.04
7.2.50.0090.00616.75
7.2.40.0040.00817.08
7.2.30.0100.00617.06
7.2.20.0060.01017.04
7.2.10.0090.00917.06
7.2.00.0060.01018.24
7.1.330.0080.00515.70
7.1.320.0030.00715.78
7.1.310.0050.01015.76
7.1.300.0050.01015.84
7.1.290.0080.00315.81
7.1.280.0000.00915.89
7.1.270.0080.00615.85
7.1.260.0100.00515.83
7.1.250.0030.01015.83
7.1.240.0080.00515.91
7.1.230.0030.01415.57
7.1.220.0070.01115.72
7.1.210.0030.00915.81
7.1.200.0080.00515.88
7.1.190.0060.00315.68
7.1.180.0080.00315.87
7.1.170.0040.01115.96
7.1.160.0040.00815.54
7.1.150.0070.00715.86
7.1.140.0060.00915.69
7.1.130.0120.00315.84
7.1.120.0000.01715.82
7.1.110.0080.00515.61
7.1.100.0030.00917.13
7.1.90.0000.00915.66
7.1.80.0040.01115.86
7.1.70.0050.00916.55
7.1.60.0070.01217.59
7.1.50.0080.00816.31
7.1.40.0030.01115.82
7.1.30.0040.01215.70
7.1.20.0040.01415.93
7.1.10.0000.01415.85
7.1.00.0050.04319.03
7.0.330.0030.00615.49
7.0.320.0030.01015.36
7.0.310.0040.01115.43
7.0.300.0000.01415.46
7.0.290.0030.00615.29
7.0.280.0100.00315.32
7.0.270.0070.00315.41
7.0.260.0030.00815.37
7.0.250.0040.01115.46
7.0.240.0040.01115.50
7.0.230.0000.00915.58
7.0.220.0030.01015.34
7.0.210.0040.00815.22
7.0.200.0130.00215.20
7.0.190.0090.00315.48
7.0.180.0040.01515.37
7.0.170.0030.01015.34
7.0.160.0070.00715.26
7.0.150.0130.00015.44
7.0.140.0070.03818.67
7.0.130.0060.00315.43
7.0.120.0080.00415.25
7.0.110.0070.00315.20
7.0.100.0050.03717.79
7.0.90.0050.03917.84
7.0.80.0030.02317.59
7.0.70.0050.02817.70
7.0.60.0090.02217.70
7.0.50.0080.04018.00
7.0.40.0090.03616.75
7.0.30.0100.04016.87
7.0.20.0050.03216.80
7.0.10.0020.05416.84
7.0.00.0070.04416.82
5.6.400.0030.01014.57
5.6.390.0030.00714.58
5.6.380.0070.00714.53
5.6.370.0060.00914.37
5.6.360.0040.01114.57
5.6.350.0100.00014.29
5.6.340.0000.01414.37
5.6.330.0100.00014.53
5.6.320.0030.00614.50
5.6.310.0060.00914.54
5.6.300.0030.00614.35
5.6.290.0090.00414.84
5.6.280.0050.04017.84
5.6.270.0080.00414.86
5.6.260.0080.00414.75
5.6.250.0080.02517.69
5.6.240.0020.03317.72
5.6.230.0100.03317.53
5.6.220.0050.02517.71
5.6.210.0070.02217.70
5.6.200.0070.02217.80
5.6.190.0070.03017.76
5.6.180.0110.02817.82
5.6.170.0070.04818.00
5.6.160.0080.04517.86
5.6.150.0050.04417.70
5.6.140.0100.04517.90
5.6.130.0030.03217.83
5.6.120.0070.02317.87
5.6.110.0070.04617.88
5.6.100.0050.04717.91
5.6.90.0100.04617.90
5.6.80.0080.04617.39
5.6.70.0080.04517.29
5.6.60.0100.04217.59
5.6.50.0080.04317.44
5.6.40.0070.04217.47
5.6.30.0100.03717.47
5.6.20.0030.03817.47
5.6.10.0150.04017.47
5.6.00.0070.03517.41
5.5.380.0020.02817.54
5.5.370.0080.02517.58
5.5.360.0020.02817.51
5.5.350.0040.02717.62
5.5.340.0030.04017.81
5.5.330.0050.04517.55
5.5.320.0090.04317.78
5.5.310.0090.03717.70
5.5.300.0050.03617.80
5.5.290.0130.04117.61
5.5.280.0020.04317.69
5.5.270.0130.03417.75
5.5.260.0050.04917.86
5.5.250.0100.02417.71
5.5.240.0070.03917.49
5.5.230.0020.03817.23
5.5.220.0050.04317.19
5.5.210.0070.02817.25
5.5.200.0140.03817.41
5.5.190.0080.04117.38
5.5.180.0120.03817.44
5.5.170.0090.00614.70
5.5.160.0090.02417.40
5.5.150.0080.04617.30
5.5.140.0070.04217.36
5.5.130.0050.04317.18
5.5.120.0020.03617.32
5.5.110.0100.02317.46
5.5.100.0060.03817.34
5.5.90.0050.03517.26
5.5.80.0080.03817.33
5.5.70.0080.03517.15
5.5.60.0070.02317.20
5.5.50.0070.02617.41
5.5.40.0080.02517.16
5.5.30.0050.03717.18
5.5.20.0080.03717.41
5.5.10.0050.04717.28
5.5.00.0120.02817.10
5.4.450.0100.03815.31
5.4.440.0090.02515.27
5.4.430.0120.03715.17
5.4.420.0090.03315.12
5.4.410.0040.02815.35
5.4.400.0040.04715.17
5.4.390.0070.04215.02
5.4.380.0000.04415.24
5.4.370.0070.04115.25
5.4.360.0070.04015.16
5.4.350.0080.03415.16
5.4.340.0070.03215.11
5.4.330.0040.00811.26
5.4.320.0130.03115.13
5.4.310.0050.03015.23
5.4.300.0050.03515.03
5.4.290.0120.02715.22
5.4.280.0030.04715.07
5.4.270.0050.04615.15
5.4.260.0040.04215.28
5.4.250.0020.04815.22
5.4.240.0060.04415.10
5.4.230.0070.03815.19
5.4.220.0020.04515.01
5.4.210.0050.04215.17
5.4.200.0030.03715.26
5.4.190.0070.03515.21
5.4.180.0070.02115.24
5.4.170.0060.04115.25
5.4.160.0060.02315.06
5.4.150.0060.03015.21
5.4.140.0020.04013.84
5.4.130.0030.03613.74
5.4.120.0050.03413.76
5.4.110.0070.04313.66
5.4.100.0040.03213.88
5.4.90.0070.03513.82
5.4.80.0070.04213.89
5.4.70.0070.03413.87
5.4.60.0050.04113.85
5.4.50.0070.03313.80
5.4.40.0070.03813.90
5.4.30.0070.03913.72
5.4.20.0040.03013.75
5.4.10.0000.03113.79
5.4.00.0070.03513.65
5.3.290.0050.02512.79
5.3.280.0080.03312.80
5.3.270.0060.04312.69
5.3.260.0060.03812.81
5.3.250.0050.02312.83
5.3.240.0100.02912.64
5.3.230.0030.02712.80
5.3.220.0070.02212.72
5.3.210.0080.02712.65
5.3.200.0070.02312.73
5.3.190.0050.03712.64
5.3.180.0070.04012.84
5.3.170.0110.03312.68
5.3.160.0050.04212.79
5.3.150.0070.03712.77
5.3.140.0050.04312.72
5.3.130.0080.03512.72
5.3.120.0050.04212.77
5.3.110.0050.04212.62
5.3.100.0070.03312.51
5.3.90.0030.04012.49
5.3.80.0070.03312.29
5.3.70.0080.02012.40
5.3.60.0050.02212.39
5.3.50.0060.03512.39
5.3.40.0020.03412.36
5.3.30.0070.03612.27
5.3.20.0070.03612.12
5.3.10.0080.03512.04
5.3.00.0050.02812.09

preferences:
43.61 ms | 401 KiB | 5 Q