- var_dump: documentation ( source)
- preg_match: documentation ( source)
- preg_split: documentation ( source)
<?php declare(strict_types = 1);
class Test
{
private function parseDocComment(string $comment): array
{
$result = [];
foreach (\preg_split('#[\r\n]+#', $comment, -1, \PREG_SPLIT_NO_EMPTY) as $line) {
if (\preg_match('#\s\*\s*@([a-z0-9\-_])\s*(.*)#i', $line, $match)) {
$result[$match[1]] = $match[2] ?? '';
}
}
var_dump($result);
return $result;
}
public function __call(string $name, array $arguments)
{
$objectReflection = new \ReflectionObject($this);
if (!$objectReflection->hasMethod($name)) {
throw new Exception('Invalid route target: ' . self::class . '::' . $name);
}
$methodReflection = $objectReflection->getMethod($name);
if (false === $comment = $methodReflection->getDocComment()) {
throw new Exception('Invalid route target: ' . self::class . '::' . $name);
}
$comment = $this->parseDocComment($comment);
if (!isset($comment['json'])) {
throw new Exception('Invalid route target: ' . self::class . '::' . $name);
}
return $this->{$name}(...$arguments);
}
/**
* @json
*/
private function method()
{
echo ":-(";
}
}
(new Test)->method();