3v4l.org

run code in 200+ php & hhvm versions
Bugs & Features
<?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);
based on gbsoJ
Output for 5.6.0 - 5.6.30, 7.0.0 - 7.3.0rc3
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) { } } } } }
Output for hhvm-3.15.4
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$handle;500981262$83967b6e80e19bceefc86efc86fb0eb6$)#2 (0) { } } ["post"]=> array(1) { ["bar"]=> object(Closure$handle#2;500981262$83967b6e80e19bceefc86efc86fb0eb6$)#3 (0) { } } } } }