$override_value) { if (!array_key_exists($override_key, $config)) { trigger_error('Undefined key in config file', E_USER_ERROR); } if (gettype($override_value) !== gettype($config[$override_key])) { trigger_error('Type mismatch in config file', E_USER_ERROR); throw new Exception('Type mismatch in config override file'); } $config[$override_key] = $override_value; } return $config[$key]; } /** * Helper for evaluating/including views */ function view(string $_view, array $_data = []) { $_path = __DIR__ . '/../views/' . $_view . '.php'; extract($_data); require $_path; } /** * Helper for converting and outputting JSON */ function json_response(mixed $data, int $status_code = 200) { http_response_code($status_code); header('Content-type: application/json'); echo json_encode($data); } /** * Helper for reading and decoding JSON from request body */ function json_decode_input(): array|bool|null { return json_decode(file_get_contents('php://input'), true); } /** * Helper for generating URLs */ function url(string $url, bool $full = false): string { $dir = dirname($_SERVER['SCRIPT_NAME']); if ($dir === '/') { $dir = ''; } if (!$full) { return $dir . $url; } return isset($_SERVER['HTTPS']) ? 'https' : 'http' . '://' . $_SERVER['HTTP_HOST'] . $dir . $url; } // now lets get routing! require __DIR__ . '/../routes/start.php';