3v4l.org

run code in 500+ PHP versions simultaneously
<?php abstract class Operation { public function __construct( protected ?string $name = null, protected ?string $foo = null, ) {} } class HttpOperation extends Operation { public function __construct( ?string $name = null, ?string $bar = null, protected string $method = 'GET', ) { $rc = new \ReflectionClass(self::class); $params = $rc->getMethod('__construct')->getParameters(); $paramsByName = []; foreach($params as $p) { $paramsByName[$p->getName()] = $p; } $a = []; foreach (func_get_args() as $i => $v) { $a[$params[$i]->getName()] = $v; } $args = []; $parentConstruct = $rc->getParentClass()->getMethod('__construct'); foreach ($parentConstruct->getParameters() as $parameter) { $args[$name = $parameter->getName()] = $a[$name] ?? null; if (null === $args[$name] && isset($paramsByName[$name]) && $paramsByName[$name]->isDefaultValueAvailable()) { $args[$name] = $paramsByName[$name]->getDefaultValue(); } } $parentConstruct->invokeArgs($this, $args); } } class Get extends HttpOperation { public function __construct( ?string $name = null, ?string $bar = null, string $method = 'GET', ) { $rc = new \ReflectionClass(self::class); $params = $rc->getMethod('__construct')->getParameters(); $paramsByName = []; foreach($params as $p) { $paramsByName[$p->getName()] = $p; } $a = []; foreach (func_get_args() as $i => $v) { $a[$params[$i]->getName()] = $v; } $args = []; $parentConstruct = $rc->getParentClass()->getMethod('__construct'); foreach ($parentConstruct->getParameters() as $parameter) { $args[$name = $parameter->getName()] = $a[$name] ?? null; if (null === $args[$name] && isset($paramsByName[$name]) && $paramsByName[$name]->isDefaultValueAvailable()) { $args[$name] = $paramsByName[$name]->getDefaultValue(); } } $parentConstruct->invokeArgs($this, $args); } } var_dump(new Get(name: 'test', method: 'POST')); var_dump(new Get(name: 'test'));

preferences:
24.42 ms | 474 KiB | 4 Q