3v4l.org

run code in 300+ PHP versions simultaneously
<?php #[Attribute] class Getter{} #[Attribute] class Setter{} class CallingInaccessibleUndeclaredMethod extends Exception{} class AccessingNonExistentProperty extends Exception{} class PassingInvalidNumberOfArguments extends Exception{} trait SetterGetter { private static array $listOfGettersAndSetters = []; private function getFieldNameFromMethodName(string $methodName): string { $fieldName = mb_substr($methodName, 3); $firstChar = mb_strtolower(mb_substr($fieldName, 0, 1)); $lastChars = mb_substr($fieldName, 1); $fieldName = $firstChar . $lastChars; return $fieldName; } private function getPropertyAccessMethods(string $methodName, object $object, string $fieldName): array { $methods = []; $property = new ReflectionProperty(get_class($object), $fieldName); $properties = $property->getAttributes(); foreach ($properties as $property) { $methodName = $property->getName(); if ($methodName === 'Setter') { $methods[] = 'set'; } elseif ($methodName === 'Getter') { $methods[] = 'get'; } } return $methods; } public function __call(string $name, array $arguments) { $prefix = mb_substr($name, 0, 3); if ($prefix !== 'get' && $prefix !== 'set') { throw new CallingInaccessibleUndeclaredMethod('Из необъявленных методов этого класса можно вызывать только геттер и сеттер.'); } $fieldName = $this->getFieldNameFromMethodName($name); if (!property_exists(get_class($this), $fieldName)) { throw new AccessingNonExistentProperty('В классе ' . get_class($object) . 'не существует свойства с именем' . $fieldName); } $fieldValue = $arguments[0] ?? null; if (isset(self::$listOfGettersAndSetters[$name]) && $prefix === 'get') { return self::$listOfGettersAndSetters[$name](); } elseif (isset(self::$listOfGettersAndSetters[$name]) && $prefix === 'set') { return self::$listOfGettersAndSetters[$name]($fieldValue); } else { $methods = $this->getPropertyAccessMethods($name, $this, $fieldName); if (!in_array($prefix, $methods)) { throw new CallingInaccessibleUndeclaredMethod('К этому полю нельзя обращаться через метод ' . $prefix); } if ($prefix === 'get') { if (count($arguments) !== 0) { throw new PassingInvalidNumberOfArguments('В геттер нельзя передавать аргументы.'); } self::$listOfGettersAndSetters[$name] = fn() => $this->$fieldName; return self::$listOfGettersAndSetters[$name](); } elseif ($prefix === 'set') { if (count($arguments) !== 1) { throw new PassingInvalidNumberOfArguments('В сеттер можно передавать только один аргумент.'); } self::$listOfGettersAndSetters[$name] = fn($fieldValue) => $this->$fieldName = $fieldValue; self::$listOfGettersAndSetters[$name]($fieldValue); } } } } class Test { use SetterGetter; #[Setter] #[Getter] private int $number; } $test = new Test(); $test->setNumber(5); echo $test->getNumber();

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.120.0140.00624.23
8.4.110.0140.00718.96
8.4.100.0080.00218.94
8.4.90.0070.00320.48
8.4.80.0060.00218.77
8.4.70.0100.01017.95
8.4.60.0040.00518.77
8.4.50.0100.00917.71
8.4.40.0180.00317.38
8.4.30.0160.00318.71
8.4.20.0210.00018.85
8.4.10.0060.00319.37
8.3.250.0090.00918.72
8.3.240.0070.00217.40
8.3.230.0100.00916.59
8.3.220.0030.00518.86
8.3.210.0070.01116.82
8.3.200.0050.00416.79
8.3.190.0100.00918.33
8.3.180.0060.00716.64
8.3.170.0190.00020.42
8.3.160.0150.00416.98
8.3.150.0050.00317.27
8.3.140.0060.00318.84
8.3.130.0040.00418.31
8.3.120.0060.00319.24
8.3.110.0030.00820.94
8.3.100.0100.00016.66
8.3.90.0080.00026.77
8.3.80.0090.00016.75
8.3.70.0090.00616.63
8.3.60.0060.00918.43
8.3.50.0180.00416.54
8.3.40.0050.01020.39
8.3.30.0090.00620.17
8.3.20.0040.00424.18
8.3.10.0110.00723.68
8.3.00.0150.00322.75
8.2.290.0040.00520.48
8.2.280.0130.00718.46
8.2.270.0130.00619.11
8.2.260.0070.01120.11
8.2.250.0150.00018.46
8.2.240.0000.01817.20
8.2.230.0000.00922.58
8.2.220.0040.01224.06
8.2.210.0050.00326.77
8.2.200.0060.00316.38
8.2.190.0060.01016.75
8.2.180.0180.00016.50
8.2.170.0040.01119.02
8.2.160.0100.00322.96
8.2.150.0050.00325.66
8.2.140.0070.01123.24
8.2.130.0090.00623.24
8.2.120.0130.00622.77
8.2.110.0100.00622.82
8.2.100.0130.00622.79
8.2.90.0090.00922.65
8.2.80.0090.01022.69
8.2.70.0070.01122.67
8.2.60.0100.00722.71
8.2.50.0110.00822.70
8.2.40.0130.00622.73
8.2.30.0080.00622.68
8.2.20.0080.00822.69
8.2.10.0060.01022.68
8.2.00.0100.00422.73
8.1.330.0060.00422.02
8.1.320.0110.00717.94
8.1.310.0090.00016.61
8.1.300.0060.00320.17
8.1.290.0060.00330.84
8.1.280.0070.01325.92
8.1.270.0080.00723.84
8.1.260.0060.00823.76
8.1.250.0080.00323.82
8.1.240.0060.00622.65
8.1.230.0050.00522.67
8.1.220.0100.00222.75
8.1.210.0020.01022.65
8.1.200.0070.00422.63
8.1.190.0070.00422.67
8.1.180.0070.00322.62
8.1.170.0070.00822.65
8.1.160.0070.00722.65
8.1.150.0070.00622.62
8.1.140.0060.00822.62
8.1.130.0090.00622.76
8.1.120.0020.00822.65
8.1.110.0060.00522.64
8.1.100.0090.00422.65
8.1.90.0060.00422.65
8.1.80.0050.00322.63
8.1.70.0070.00122.65
8.1.60.0050.00522.71
8.1.50.0070.00222.66
8.1.40.0060.00222.73
8.1.30.0040.00722.69
8.1.20.0050.00622.69
8.1.10.0070.00222.74
8.1.00.0050.00422.66

preferences:
27.25 ms | 403 KiB | 5 Q