https://www.php.net/manual/en/function.autoload.php
__autoload(PHP 5, PHP 7)
__autoload — Attempt to load undefined class
Warning
This feature has been DEPRECATED as of PHP 7.2.0. Relying on this feature is highly discouraged.
__autoload函数在php7.2废弃,所以要用 spl_autoload_register 函数替代
https://www.php.net/manual/en/function.spl-autoload-register.php
spl_autoload_register(PHP 5 >= 5.1.0, PHP 7)
spl_autoload_register — Register given function as __autoload() implementation
Description
spl_autoload_register ([ callable $autoload_function
[, bool $throw
= TRUE
[, bool $prepend
= FALSE
]]] ) : bool
* autoload.php
<?php
// 需要注册的php类路径 (相对于依赖库的目录, 这里库就在当前目录dirname(__FILE__))
$prefixList = ['lib', 'tools'];
foreach ($prefixList as $prefix) {
spl_autoload_register(function ($clazz) use($prefix) {
$baseDir = dirname(__FILE__).DIRECTORY_SEPARATOR.str_replace('\\', '/', $prefix);
$len = strlen($prefix);
if (strncmp($prefix, $clazz, $len) !== 0) {
return;
}
$relativeClass = substr($clazz, $len);
$file = $baseDir.str_replace('\\', '/', $relativeClass.'.php');
if (file_exists($file)) {
require $file;
}
});
}
./tools/StatusCode.php
<?php
/**
* Created by PhpStorm.
* User: mingzhanghui
* Date: 9/10/2019
* Time: 09:52
*/
namespace tools;
class StatusCode {
private static $status_header_desc = array(
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',
226 => 'IM Used',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => 'Reserved',
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 Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
422 => 'Unprocessable Entity',
423 => 'Locked',
424 => 'Failed Dependency',
426 => 'Upgrade Required',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
506 => 'Variant Also Negotiates',
507 => 'Insufficient Storage',
510 => 'Not Extended'
);
public static function generateCode() {
printf("switch (\$code) {\n");
foreach (self::$status_header_desc as $code => $desc) {
printf(" case %d: \$desc = \"%s\"; ", $code, $desc);
$len = 32 - strlen($desc);
while ($len-- > 0) {
printf(" ");
}
printf("break;\n");
}
printf(" default: \$desc=\"\";\n");
printf("};\n");
printf("return \$desc;\n");
}
}
根据PHP关联数组生成switch case的代码
* ./lib/Http.php
<?php
class Http {
public static function statusHeader($code) {
$desc = self::getStatusHeaderDesc($code);
if (!isset($desc[0])) {
return false;
}
$protocol = $_SERVER['SERVER_PROTOCOL'];
// set default protocol
if ("HTTP/1.1" !== $protocol && "HTTP/1.0" !== $protocol) {
$protocol = "HTTP/1.0";
}
$statusHeader = sprintf("%s %d %s", $protocol, $code, $desc);
header($statusHeader);
}
/**
* @param $code 200
* @return string "OK"
*/
private static function getStatusHeaderDesc($code) {
switch ($code) {
case 100: $desc = "Continue"; break;
case 101: $desc = "Switching Protocols"; break;
case 102: $desc = "Processing"; break;
case 200: $desc = "OK"; break;
case 201: $desc = "Created"; break;
case 202: $desc = "Accepted"; break;
case 203: $desc = "Non-Authoritative Information"; break;
case 204: $desc = "No Content"; break;
case 205: $desc = "Reset Content"; break;
case 206: $desc = "Partial Content"; break;
case 207: $desc = "Multi-Status"; break;
case 226: $desc = "IM Used"; break;
case 300: $desc = "Multiple Choices"; break;
case 301: $desc = "Moved Permanently"; break;
case 302: $desc = "Found"; break;
case 303: $desc = "See Other"; break;
case 304: $desc = "Not Modified"; break;
case 305: $desc = "Use Proxy"; break;
case 306: $desc = "Reserved"; break;
case 307: $desc = "Temporary Redirect"; break;
case 400: $desc = "Bad Request"; break;
case 401: $desc = "Unauthorized"; break;
case 402: $desc = "Payment Required"; break;
case 403: $desc = "Forbidden"; break;
case 404: $desc = "Not Found"; break;
case 405: $desc = "Method Not Allowed"; break;
case 406: $desc = "Not Acceptable"; break;
case 407: $desc = "Proxy Authentication Required"; break;
case 408: $desc = "Request Timeout"; break;
case 409: $desc = "Conflict"; break;
case 410: $desc = "Gone"; break;
case 411: $desc = "Length Required"; break;
case 412: $desc = "Precondition Failed"; break;
case 413: $desc = "Request Entity Too Large"; break;
case 414: $desc = "Request-URI Too Long"; break;
case 415: $desc = "Unsupported Media Type"; break;
case 416: $desc = "Requested Range Not Satisfiable"; break;
case 417: $desc = "Expectation Failed"; break;
case 422: $desc = "Unprocessable Entity"; break;
case 423: $desc = "Locked"; break;
case 424: $desc = "Failed Dependency"; break;
case 426: $desc = "Upgrade Required"; break;
case 500: $desc = "Internal Server Error"; break;
case 501: $desc = "Not Implemented"; break;
case 502: $desc = "Bad Gateway"; break;
case 503: $desc = "Service Unavailable"; break;
case 504: $desc = "Gateway Timeout"; break;
case 505: $desc = "HTTP Version Not Supported"; break;
case 506: $desc = "Variant Also Negotiates"; break;
case 507: $desc = "Insufficient Storage"; break;
case 510: $desc = "Not Extended"; break;
default: $desc="";
};
return $desc;
}
}
* index.php
<?php
include dirname(__FILE__).'/autoload.php';
//use \tools\StatusCode;
//echo StatusCode::generateCode().PHP_EOL;
use \lib\Http;
Http::statusHeader(403);
$ php -S 0.0.0.0:8032
启动Web服务
$ curl -i http://192.168.4.157:8032/index.php
HTTP/1.1 403 Forbidden
Host: 192.168.4.157:8032
Date: Tue, 10 Sep 2019 10:23:39 +0800
Connection: close
X-Powered-By: PHP/7.2.8
X-Xdebug-Profile-Filename: D:/opt/xampp/xdebug\cachegrind.out.4092
Content-type: text/html; charset=UTF-8
如果把依赖的库都放到 vendor目录下
autoload.php 只需要改一行
$baseDir = dirname(__FILE__).'/vendor/'.str_replace('\\', '/', $prefix);