<?php
//use ErrorException;
//use InvalidArgumentException;
/**
* HTTP Status values have a code (int) and reason (string).
*
* @internal Implemented similar to a type-safe enum.
*
* @property-read int $code the status code
* @property-read string $reason the status description
*/
final class Status
{
/** @var array (int) code => (string) reason */
private static $codeReasons = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-status',
208 => 'Already Reported',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => 'Switch Proxy',
307 => 'Temporary Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Time-out',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Large',
415 => 'Unsupported Media Type',
416 => 'Requested range not satisfiable',
417 => 'Expectation Failed',
418 => 'I\'m a teapot',
422 => 'Unprocessable Entity',
423 => 'Locked',
424 => 'Failed Dependency',
425 => 'Unordered Collection',
426 => 'Upgrade Required',
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Time-out',
505 => 'HTTP Version not supported',
506 => 'Variant Also Negotiates',
507 => 'Insufficient Storage',
508 => 'Loop Detected',
511 => 'Network Authentication Required',
];
/** @var self[] */
private static $instances = [];
/** @var int */
private $code;
/** @var string */
private $reason;
/**
* Singleton constructor
*
* @param int $aCode an http status code
* @throws InvalidArgumentException on invalid code
*/
private function __construct($aCode)
{
if (!static::validate($aCode)) {
throw new InvalidArgumentExeption("Invalid status code: [$aCode]");
}
$this->code = (int) $aCode;
$this->reason = static::$codeReasons[$this->code];
}
/**
* Factory constructor
*
* Methods must not start with a number, so an underscore prefix is necessary.
*
* @example $status = Status::_404();
*
* @param string $aMethod a status code prefixed with an underscore
* @param array $arguments unused arguments passed to the magic method
* @return self
*/
public static function __callStatic($aMethod, array $arguments = [])
{
$aMethod = trim($aMethod, '_');
if (!isset(static::$instances[$aMethod])) {
static::$instances[$aMethod] = new static($aMethod);
}
return static::$instances[$aMethod];
}
/**
* List all HTTP statuses
*
* @yield self
*/
public static function listAll()
{
foreach (static::$codeReasons as $code => $reason) {
yield $code => $reason;
}
}
/**
* Verify that a code is valid
*
* @param int $aCode the status code to verify
* @return bool
*/
public static function validate($aCode)
{
return ($aCode instanceof self) || isset(static::$codeReasons[(int) $aCode]);
}
/**
* Allow public property access
*
* @param string $aProperty
* @return mixed
* @throws ErrorException on invalid property
*/
public function __get($aProperty)
{
if (property_exists($this, $aProperty)) {
return $this->{$aProperty};
}
$debug = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
$error = sprintf('Undefined property %s::$%s', __CLASS__, $aProperty);
throw new ErrorException($error, 0, E_USER_NOTICE, $debug[1]['file'], $debug[1]['line']);
}
/** @return string */
public function __toString()
{
return $this->code . ' ' . $this->reason;
}
}
var_dump(iterator_to_array(Status::listAll()));
- Output for 5.5.24 - 5.5.35, 5.6.7 - 5.6.28, 7.0.0 - 7.0.20, 7.1.0 - 7.1.20, 7.2.0 - 7.2.33, 7.3.16 - 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.4, 8.3.6
- array(57) {
[100]=>
string(8) "Continue"
[101]=>
string(19) "Switching Protocols"
[102]=>
string(10) "Processing"
[200]=>
string(2) "OK"
[201]=>
string(7) "Created"
[202]=>
string(8) "Accepted"
[203]=>
string(29) "Non-Authoritative Information"
[204]=>
string(10) "No Content"
[205]=>
string(13) "Reset Content"
[206]=>
string(15) "Partial Content"
[207]=>
string(12) "Multi-status"
[208]=>
string(16) "Already Reported"
[300]=>
string(16) "Multiple Choices"
[301]=>
string(17) "Moved Permanently"
[302]=>
string(5) "Found"
[303]=>
string(9) "See Other"
[304]=>
string(12) "Not Modified"
[305]=>
string(9) "Use Proxy"
[306]=>
string(12) "Switch Proxy"
[307]=>
string(18) "Temporary Redirect"
[400]=>
string(11) "Bad Request"
[401]=>
string(12) "Unauthorized"
[402]=>
string(16) "Payment Required"
[403]=>
string(9) "Forbidden"
[404]=>
string(9) "Not Found"
[405]=>
string(18) "Method Not Allowed"
[406]=>
string(14) "Not Acceptable"
[407]=>
string(29) "Proxy Authentication Required"
[408]=>
string(16) "Request Time-out"
[409]=>
string(8) "Conflict"
[410]=>
string(4) "Gone"
[411]=>
string(15) "Length Required"
[412]=>
string(19) "Precondition Failed"
[413]=>
string(24) "Request Entity Too Large"
[414]=>
string(21) "Request-URI Too Large"
[415]=>
string(22) "Unsupported Media Type"
[416]=>
string(31) "Requested range not satisfiable"
[417]=>
string(18) "Expectation Failed"
[418]=>
string(12) "I'm a teapot"
[422]=>
string(20) "Unprocessable Entity"
[423]=>
string(6) "Locked"
[424]=>
string(17) "Failed Dependency"
[425]=>
string(20) "Unordered Collection"
[426]=>
string(16) "Upgrade Required"
[428]=>
string(21) "Precondition Required"
[429]=>
string(17) "Too Many Requests"
[431]=>
string(31) "Request Header Fields Too Large"
[500]=>
string(21) "Internal Server Error"
[501]=>
string(15) "Not Implemented"
[502]=>
string(11) "Bad Gateway"
[503]=>
string(19) "Service Unavailable"
[504]=>
string(16) "Gateway Time-out"
[505]=>
string(26) "HTTP Version not supported"
[506]=>
string(23) "Variant Also Negotiates"
[507]=>
string(20) "Insufficient Storage"
[508]=>
string(13) "Loop Detected"
[511]=>
string(31) "Network Authentication Required"
}
- Output for 8.3.5
- Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
array(57) {
[100]=>
string(8) "Continue"
[101]=>
string(19) "Switching Protocols"
[102]=>
string(10) "Processing"
[200]=>
string(2) "OK"
[201]=>
string(7) "Created"
[202]=>
string(8) "Accepted"
[203]=>
string(29) "Non-Authoritative Information"
[204]=>
string(10) "No Content"
[205]=>
string(13) "Reset Content"
[206]=>
string(15) "Partial Content"
[207]=>
string(12) "Multi-status"
[208]=>
string(16) "Already Reported"
[300]=>
string(16) "Multiple Choices"
[301]=>
string(17) "Moved Permanently"
[302]=>
string(5) "Found"
[303]=>
string(9) "See Other"
[304]=>
string(12) "Not Modified"
[305]=>
string(9) "Use Proxy"
[306]=>
string(12) "Switch Proxy"
[307]=>
string(18) "Temporary Redirect"
[400]=>
string(11) "Bad Request"
[401]=>
string(12) "Unauthorized"
[402]=>
string(16) "Payment Required"
[403]=>
string(9) "Forbidden"
[404]=>
string(9) "Not Found"
[405]=>
string(18) "Method Not Allowed"
[406]=>
string(14) "Not Acceptable"
[407]=>
string(29) "Proxy Authentication Required"
[408]=>
string(16) "Request Time-out"
[409]=>
string(8) "Conflict"
[410]=>
string(4) "Gone"
[411]=>
string(15) "Length Required"
[412]=>
string(19) "Precondition Failed"
[413]=>
string(24) "Request Entity Too Large"
[414]=>
string(21) "Request-URI Too Large"
[415]=>
string(22) "Unsupported Media Type"
[416]=>
string(31) "Requested range not satisfiable"
[417]=>
string(18) "Expectation Failed"
[418]=>
string(12) "I'm a teapot"
[422]=>
string(20) "Unprocessable Entity"
[423]=>
string(6) "Locked"
[424]=>
string(17) "Failed Dependency"
[425]=>
string(20) "Unordered Collection"
[426]=>
string(16) "Upgrade Required"
[428]=>
string(21) "Precondition Required"
[429]=>
string(17) "Too Many Requests"
[431]=>
string(31) "Request Header Fields Too Large"
[500]=>
string(21) "Internal Server Error"
[501]=>
string(15) "Not Implemented"
[502]=>
string(11) "Bad Gateway"
[503]=>
string(19) "Service Unavailable"
[504]=>
string(16) "Gateway Time-out"
[505]=>
string(26) "HTTP Version not supported"
[506]=>
string(23) "Variant Also Negotiates"
[507]=>
string(20) "Insufficient Storage"
[508]=>
string(13) "Loop Detected"
[511]=>
string(31) "Network Authentication Required"
}
- Output for 5.4.0 - 5.4.45
- Parse error: syntax error, unexpected '$code' (T_VARIABLE) in /in/VnM59 on line 129
Process exited with code 255. - Output for 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29
- Parse error: syntax error, unexpected '[' in /in/VnM59 on line 17
Process exited with code 255. - Output for 5.0.0 - 5.0.5
- Parse error: parse error, unexpected '[' in /in/VnM59 on line 17
Process exited with code 255. - Output for 4.4.2 - 4.4.9
- Parse error: syntax error, unexpected T_CLASS in /in/VnM59 on line 14
Process exited with code 255. - Output for 4.3.0 - 4.3.1, 4.3.5 - 4.3.11, 4.4.0 - 4.4.1
- Parse error: parse error, unexpected T_CLASS in /in/VnM59 on line 14
Process exited with code 255. - Output for 4.3.2 - 4.3.4
- Parse error: parse error in /in/VnM59 on line 14
Process exited with code 255.
preferences:
259.45 ms | 401 KiB | 313 Q