Skip to content

Instantly share code, notes, and snippets.

@dineshuprety
Created April 18, 2025 10:00
Show Gist options
  • Save dineshuprety/8afd7e43d5fc978d44d08b740ce8a635 to your computer and use it in GitHub Desktop.
Save dineshuprety/8afd7e43d5fc978d44d08b740ce8a635 to your computer and use it in GitHub Desktop.
a well-structured PHP 8.4 class that encapsulates HTTP status codes with their corresponding messages, providing a type-safe way to work with status codes in your applications.
<?php
declare(strict_types=1);
namespace App\Http;
/**
* HTTP Status Code Class
*
* Provides a comprehensive collection of HTTP status codes with their
* corresponding messages in an object-oriented way.
*/
final class HTTPStatusCode
{
// Informational 1xx
public const CONTINUE = 100;
public const SWITCHING_PROTOCOLS = 101;
public const PROCESSING = 102;
public const EARLY_HINTS = 103;
// Successful 2xx
public const OK = 200;
public const CREATED = 201;
public const ACCEPTED = 202;
public const NON_AUTHORITATIVE_INFORMATION = 203;
public const NO_CONTENT = 204;
public const RESET_CONTENT = 205;
public const PARTIAL_CONTENT = 206;
public const MULTI_STATUS = 207;
public const ALREADY_REPORTED = 208;
public const IM_USED = 226;
// Redirection 3xx
public const MULTIPLE_CHOICES = 300;
public const MOVED_PERMANENTLY = 301;
public const FOUND = 302;
public const SEE_OTHER = 303;
public const NOT_MODIFIED = 304;
public const USE_PROXY = 305;
public const TEMPORARY_REDIRECT = 307;
public const PERMANENT_REDIRECT = 308;
// Client Error 4xx
public const BAD_REQUEST = 400;
public const UNAUTHORIZED = 401;
public const PAYMENT_REQUIRED = 402;
public const FORBIDDEN = 403;
public const NOT_FOUND = 404;
public const METHOD_NOT_ALLOWED = 405;
public const NOT_ACCEPTABLE = 406;
public const PROXY_AUTHENTICATION_REQUIRED = 407;
public const REQUEST_TIMEOUT = 408;
public const CONFLICT = 409;
public const GONE = 410;
public const LENGTH_REQUIRED = 411;
public const PRECONDITION_FAILED = 412;
public const PAYLOAD_TOO_LARGE = 413;
public const URI_TOO_LONG = 414;
public const UNSUPPORTED_MEDIA_TYPE = 415;
public const RANGE_NOT_SATISFIABLE = 416;
public const EXPECTATION_FAILED = 417;
public const IM_A_TEAPOT = 418;
public const MISDIRECTED_REQUEST = 421;
public const UNPROCESSABLE_ENTITY = 422;
public const LOCKED = 423;
public const FAILED_DEPENDENCY = 424;
public const TOO_EARLY = 425;
public const UPGRADE_REQUIRED = 426;
public const PRECONDITION_REQUIRED = 428;
public const TOO_MANY_REQUESTS = 429;
public const REQUEST_HEADER_FIELDS_TOO_LARGE = 431;
public const UNAVAILABLE_FOR_LEGAL_REASONS = 451;
// Server Error 5xx
public const INTERNAL_SERVER_ERROR = 500;
public const NOT_IMPLEMENTED = 501;
public const BAD_GATEWAY = 502;
public const SERVICE_UNAVAILABLE = 503;
public const GATEWAY_TIMEOUT = 504;
public const HTTP_VERSION_NOT_SUPPORTED = 505;
public const VARIANT_ALSO_NEGOTIATES = 506;
public const INSUFFICIENT_STORAGE = 507;
public const LOOP_DETECTED = 508;
public const BANDWIDTH_LIMIT_EXCEEDED = 509;
public const NOT_EXTENDED = 510;
public const NETWORK_AUTHENTICATION_REQUIRED = 511;
/**
* Get the status message for a given status code
*
* @throws \InvalidArgumentException When the status code is not recognized
*/
public static function getMessage(int $statusCode): string
{
return match ($statusCode) {
// Informational 1xx
self::CONTINUE => 'Continue',
self::SWITCHING_PROTOCOLS => 'Switching Protocols',
self::PROCESSING => 'Processing',
self::EARLY_HINTS => 'Early Hints',
// Successful 2xx
self::OK => 'OK',
self::CREATED => 'Created',
self::ACCEPTED => 'Accepted',
self::NON_AUTHORITATIVE_INFORMATION => 'Non-Authoritative Information',
self::NO_CONTENT => 'No Content',
self::RESET_CONTENT => 'Reset Content',
self::PARTIAL_CONTENT => 'Partial Content',
self::MULTI_STATUS => 'Multi-Status',
self::ALREADY_REPORTED => 'Already Reported',
self::IM_USED => 'IM Used',
// Redirection 3xx
self::MULTIPLE_CHOICES => 'Multiple Choices',
self::MOVED_PERMANENTLY => 'Moved Permanently',
self::FOUND => 'Found',
self::SEE_OTHER => 'See Other',
self::NOT_MODIFIED => 'Not Modified',
self::USE_PROXY => 'Use Proxy',
self::TEMPORARY_REDIRECT => 'Temporary Redirect',
self::PERMANENT_REDIRECT => 'Permanent Redirect',
// Client Error 4xx
self::BAD_REQUEST => 'Bad Request',
self::UNAUTHORIZED => 'Unauthorized',
self::PAYMENT_REQUIRED => 'Payment Required',
self::FORBIDDEN => 'Forbidden',
self::NOT_FOUND => 'Not Found',
self::METHOD_NOT_ALLOWED => 'Method Not Allowed',
self::NOT_ACCEPTABLE => 'Not Acceptable',
self::PROXY_AUTHENTICATION_REQUIRED => 'Proxy Authentication Required',
self::REQUEST_TIMEOUT => 'Request Timeout',
self::CONFLICT => 'Conflict',
self::GONE => 'Gone',
self::LENGTH_REQUIRED => 'Length Required',
self::PRECONDITION_FAILED => 'Precondition Failed',
self::PAYLOAD_TOO_LARGE => 'Payload Too Large',
self::URI_TOO_LONG => 'URI Too Long',
self::UNSUPPORTED_MEDIA_TYPE => 'Unsupported Media Type',
self::RANGE_NOT_SATISFIABLE => 'Range Not Satisfiable',
self::EXPECTATION_FAILED => 'Expectation Failed',
self::IM_A_TEAPOT => "I'm a Teapot",
self::MISDIRECTED_REQUEST => 'Misdirected Request',
self::UNPROCESSABLE_ENTITY => 'Unprocessable Entity',
self::LOCKED => 'Locked',
self::FAILED_DEPENDENCY => 'Failed Dependency',
self::TOO_EARLY => 'Too Early',
self::UPGRADE_REQUIRED => 'Upgrade Required',
self::PRECONDITION_REQUIRED => 'Precondition Required',
self::TOO_MANY_REQUESTS => 'Too Many Requests',
self::REQUEST_HEADER_FIELDS_TOO_LARGE => 'Request Header Fields Too Large',
self::UNAVAILABLE_FOR_LEGAL_REASONS => 'Unavailable For Legal Reasons',
// Server Error 5xx
self::INTERNAL_SERVER_ERROR => 'Internal Server Error',
self::NOT_IMPLEMENTED => 'Not Implemented',
self::BAD_GATEWAY => 'Bad Gateway',
self::SERVICE_UNAVAILABLE => 'Service Unavailable',
self::GATEWAY_TIMEOUT => 'Gateway Timeout',
self::HTTP_VERSION_NOT_SUPPORTED => 'HTTP Version Not Supported',
self::VARIANT_ALSO_NEGOTIATES => 'Variant Also Negotiates',
self::INSUFFICIENT_STORAGE => 'Insufficient Storage',
self::LOOP_DETECTED => 'Loop Detected',
self::BANDWIDTH_LIMIT_EXCEEDED => 'Bandwidth Limit Exceeded',
self::NOT_EXTENDED => 'Not Extended',
self::NETWORK_AUTHENTICATION_REQUIRED => 'Network Authentication Required',
default => throw new \InvalidArgumentException("Invalid HTTP status code: {$statusCode}")
};
}
/**
* Check if the status code is informational (1xx)
*/
public static function isInformational(int $statusCode): bool
{
return $statusCode >= 100 && $statusCode < 200;
}
/**
* Check if the status code is successful (2xx)
*/
public static function isSuccessful(int $statusCode): bool
{
return $statusCode >= 200 && $statusCode < 300;
}
/**
* Check if the status code is a redirection (3xx)
*/
public static function isRedirection(int $statusCode): bool
{
return $statusCode >= 300 && $statusCode < 400;
}
/**
* Check if the status code is a client error (4xx)
*/
public static function isClientError(int $statusCode): bool
{
return $statusCode >= 400 && $statusCode < 500;
}
/**
* Check if the status code is a server error (5xx)
*/
public static function isServerError(int $statusCode): bool
{
return $statusCode >= 500 && $statusCode < 600;
}
/**
* Check if the status code is an error (4xx or 5xx)
*/
public static function isError(int $statusCode): bool
{
return self::isClientError($statusCode) || self::isServerError($statusCode);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment