PHP 继承类并使用外部文件中定义的函数



这看起来很简单,但我一直在努力工作。请参考以下两个文件,我正在尝试使用 common.php 文件的公共函数并在登录.php中继承 DBConnection 类,但它似乎不起作用,得到错误代码"500"(内部服务器错误)。如果我把所有常见.php的东西都放在登录中.php它就可以正常工作,但我想在许多类中使用 DBConnection 类和公共函数,以便让它工作。有人可以帮忙吗?

常见.php

<?php
function getStatusCodeMessage($status) {
    $codes = Array(
        100 => 'Continue',
        101 => 'Switching Protocols',
        200 => 'OK',
        201 => 'Created',
        202 => 'Accepted',
        203 => 'Non-Authoritative Information',
        204 => 'No Content',
        205 => 'Reset Content',
        206 => 'Partial Content',
        300 => 'Multiple Choices',
        301 => 'Moved Permanently',
        302 => 'Found',
        303 => 'See Other',
        304 => 'Not Modified',
        305 => 'Use Proxy',
        306 => '(Unused)',
        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',
        500 => 'Internal Server Error',
        501 => 'Not Implemented',
        502 => 'Bad Gateway',
        503 => 'Service Unavailable',
        504 => 'Gateway Timeout',
        505 => 'HTTP Version Not Supported'
    );
    return (isset($codes[$status])) ? $codes[$status] : '';
}
// Helper method to send a HTTP response code/message
function sendResponse($status = 200, $body = '', $content_type = 'text/html') {
    $status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCodeMessage($status);
    header($status_header);
    header('Content-type: ' . $content_type);
    echo $body;
}
class DBConnection 
{
    protected $db;
    // Constructor - open DB connection
    function __construct() 
    {
        $this->db = new mysqli('xxx', 'xxx', 'xxx', 'xxx');
        $this->db->autocommit(FALSE);
    }
    // Destructor - close DB connection
    function __destruct() 
    {
        $this->db->close();
    }
}
?>

登录.php

   <?php
include 'common.php';
class UserAPI extends DBConnection {
    function login() {
        // Check for required parameters
        if (isset($_POST["username"]) && isset($_POST["password"])) {
            // Put parameters into local variables
            $username = $_POST["username"];
            $password = $_POST["password"];
            // Look up code in database
            $stmt = $this->db->prepare('SELECT user_username, user_password FROM User WHERE user_username=?');
            $stmt->bind_param("s", $username);
            $stmt->execute();
            $stmt->bind_result($existingUsername, $existingPassword);
            while ($stmt->fetch()) {
                break;
            }
            $stmt->close();
            // Bail if Email exist
            if ($existingUsername && $password == $existingPassword) {
                $result = array(
                    "success" => 1,
                );
                sendResponse(200, json_encode($result));
                return true;
            }
            sendResponse(400, 'Invalid Username or Password. Please try again.');
            return false;
        }
        sendResponse(400, 'Invalid request');
        return false;
    }
}
$api = new UserAPI;
$api-> login();
?>

[编辑]

我让登录.php最简单的。当我有"扩展DBConnection"时,它会给我错误,如果我删除它就可以了!

<?php
include 'common.php';
class UserAPI extends DBConnection {
    function login() {
        echo "OK";
        return true;
    }
}
$api = new UserAPI;
$api-> login();
?>

如果函数不是类的一部分,则不能将函数声明为"public"。这将触发致命的 PHP 语法错误。

解决方案:将这些函数包装在类中,并使它们成为静态函数。

或者删除可见性修饰符"公共"。

我将您的代码复制到我的本地并运行它,它可以工作。

也许您的数据库有问题。

你怎么注释掉$this->db = new mysqli('xxx', 'xxx', 'xxx', 'xxx');相关的代码。

最新更新