Php 在“中包含父对象”;要求;d文件 概述

Php 在“中包含父对象”;要求;d文件 概述,php,mysql,pdo,Php,Mysql,Pdo,我连接到index.php中的数据库,然后使用require\u once()导入我的classes.php文件。但是,当连接到数据库时,数据库连接未定义 代码 index.php $dbh = new PDO("mysql:host=$hostname;dbname=$dbname",$username,$password); require_once("inc/classes.php"); /* ..... */ if($_POST["form"]=="login"){ //R

我连接到
index.php
中的数据库,然后使用
require\u once()
导入我的
classes.php
文件。但是,当连接到数据库时,数据库连接未定义

代码
index.php

$dbh = new PDO("mysql:host=$hostname;dbname=$dbname",$username,$password);
require_once("inc/classes.php");

/* ..... */

if($_POST["form"]=="login"){

    //Retrieve values
    $e = $_POST["email"];
    $p = $_POST["password"];

    //Data validation
    if(!filter_var($e, FILTER_VALIDATE_EMAIL)||strlen($e)<3) $errors->addError("email", "Please enter a valid email address.");
    if(strlen($p)<1) $errors->addError("password", "Please enter a valid password");
    $errors->killErrors();

    //Log user in
    $user = new User($e);
    if(!$user->login($p)) $errors->addError("form", "Incorrect username or password.");
    $errors->killErrors();

    exit("success");
}
class User
{
    public $id, $email, $data;

    public function __construct($e = null){

        if(isLoggedIn()){
            $stmt = $dbh->prepare("SELECT * FROM `users` WHERE `id`=? LIMIT 1");
            $stmt->execute(array($_SESSION["userid"]));
            $this->data = $stmt->fetch(PDO::FETCH_ASSOC);
        } else $this->email = $e;

    }

    public function login($p){
        //Perform database query for user
        $stmt = $dbh->prepare("SELECT `id`, `password` FROM `users` WHERE `email`=? LIMIT 1");
        $stmt->execute(array($this->email));
        if($stmt->rowCount()<1) return false;

        //Check password is correct
        $data = $stmt->fetch(PDO::FETCH_ASSOC);
        if(!password_verify($p, $data["password"])) return false;

        if(!$this->email) exit("User can only be logged in with an email address, not by User ID");

        $this->id = $data["id"];
        return $this->validate($this->id) ? true : false;
    }

}
输出 注意:未定义的变量:dbh in/var/www/html/foo/public\u html/bar/inc/classes.php在线80

致命错误:/var/www/html/foo/public\u html/bar/inc/classes.php在线80

第80行是:

$stmt = $dbh->prepare("SELECT `id`, `password` FROM `users` WHERE `email`=? LIMIT 1");
问题:
如何将数据库连接包含在
index.php
中,并使
classes.php
文件接受该PDO对象?

您必须使连接全局化:

global $dbh; 

因为。仔细操作后,可以使用全局变量。许多人过于随意地使用它,并且有一种想要全球化所有变量的倾向。我个人在类内的函数中这样做以消除歧义。

您必须使您的连接成为全局连接:

global $dbh; 
因为。仔细操作后,可以使用全局变量。许多人过于随意地使用它,并且有一种想要全球化所有变量的倾向。我个人在类内的函数中这样做是为了消除歧义。

-正如@JayBlanchard所写,您需要将连接句柄作为全局变量引用

但是,将依赖项传递到对象中要干净得多。例如,在实例化用户时,可以传入连接

$user = new User($dbh, $e);
然后可以为连接句柄设置一个私有变量。通过这种方式,您可以在index.php中更改变量的名称,或者更改它的实例化方式,而不会因为不同文件中的更改而导致用户类崩溃

-在@JayBlanchard写入时,需要将连接句柄作为全局变量引用

但是,将依赖项传递到对象中要干净得多。例如,在实例化用户时,可以传入连接

$user = new User($dbh, $e);

然后可以为连接句柄设置一个私有变量。通过这种方式,您可以在index.php中更改变量的名称,或者更改它的实例化方式,而不会因为不同文件中的更改而导致用户类崩溃

您必须使其
global$dbh在函数内部。它是@JayBlanchard-直接在类或单个函数中?我听说不建议使用
global
——在类中仍然是这样吗?仔细做就可以了,很多人使用它太随意了,并且有一种想要全球化所有变量的倾向。我个人在函数中这样做是为了消除歧义。@JayBlanchard感谢-经过测试并正在工作。如果您将此作为我接受的答案发布,欢迎您也可以将函数参数中的
$dbh
传递为
login($p,$dbh)
使用
函数登录($p,$dbh)
获取它,您必须使其成为
全局$dbh在函数内部。它是@JayBlanchard-直接在类或单个函数中?我听说不建议使用
global
——在类中仍然是这样吗?仔细做就可以了,很多人使用它太随意了,并且有一种想要全球化所有变量的倾向。我个人在函数中这样做是为了消除歧义。@JayBlanchard感谢-经过测试并正在工作。如果您将此作为我接受的答案发布,欢迎您也可以将函数参数中的
$dbh
传递为
login($p,$dbh)
使用
函数登录($p,$dbh)