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

php 输出HTTP响应状态码 spl_autoload_register_autoload

* 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
php 输出HTTP响应状态码 spl_autoload_register_响应码_02

 

如果把依赖的库都放到 vendor目录下

php 输出HTTP响应状态码 spl_autoload_register_php_03

autoload.php 只需要改一行

$baseDir = dirname(__FILE__).'/vendor/'.str_replace('\\', '/', $prefix);