3v4l.org

run code in 300+ PHP versions simultaneously
<?php class Request { private $method; private $path; function __construct($method, $path) { $this->method = $method; $this->path = $path; } function getMethod() { return $this->method; } function getPath() { return $this->path; } } class Router { private $routes = [ 'get' => [], 'post' => [] ]; function get($pattern, callable $handler) { $this->routes['get'][$pattern] = $handler; return $this; } function post($pattern, callable $handler) { $this->routes['post'][$pattern] = $handler; return $this; } function match(Request $request) { $method = strtolower($request->getMethod()); if (!isset($this->routes[$method])) { return false; } $path = $request->getPath(); foreach ($this->routes[$method] as $pattern => $handler) { if ($pattern === $path) { return $handler; } } return false; } } class Dispatcher { private $router; function __construct(Router $router) { $this->router = $router; } function handle(Request $request) { $handler = $this->router->match($request); if (!$handler) { echo "Could not find your resource!\n"; return; } $handler(); } } $router = new Router(); $router->get('foo', function() { echo "GET foo\n"; }); $router->post('bar', function() { echo "POST bar\n"; }); $dispatcher = new Dispatcher($router); $dispatcher->handle(new Request('GET', 'foo')); $dispatcher->handle(new Request('POST', 'bar')); $dispatcher->handle(new Request('GET', 'qux')); var_dump($dispatcher);
Output for 7.0.0 - 7.0.20, 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.7
GET foo POST bar Could not find your resource! object(Dispatcher)#4 (1) { ["router":"Dispatcher":private]=> object(Router)#1 (1) { ["routes":"Router":private]=> array(2) { ["get"]=> array(1) { ["foo"]=> object(Closure)#2 (0) { } } ["post"]=> array(1) { ["bar"]=> object(Closure)#3 (0) { } } } } }

preferences:
163.99 ms | 404 KiB | 217 Q