; // Throws when things go wrong public function intParamX(string $name): int { $params = $this->getParams(); invariant($params->contains($name), sprintf('Unknown param: %s', $name)); $param = $params[$name]; invariant(is_numeric($param), sprintf('Param %s is not an int', $name)); return (int)$param; } // A lenient version public function intParam(string $name): ?int { $params = $this->getParams(); if (!$params->contains($name)) { return null; } $param = $params[$name]; if (!is_numeric($param)) { return null; } return (int)$param; } } final class MyGETRequest extends MyRequest { public function getParams(): Map { return getGETParams(); } } final class MyPOSTRequest extends MyRequest { public function getParams(): Map { return getPOSTParams(); } }