【问题标题】:PHP OOP - Database class (Undefined variable)PHP OOP - 数据库类(未定义变量)
【发布时间】:2015-10-13 16:10:25
【问题描述】:

使用 PHP 学习 OOP 我已经创建了一个数据库类,但是我得到了未定义的变量 db_host db_name db_username 和 db_password。我尝试使用 $this->db_host 来删除 db_host 的未定义变量,但随后出现致命错误,提示“不在对象上下文中使用 $this”。

<?php
class database
{
    private $db_host = "";
    private $db_username = "";
    private $db_password = "";
    private $db_name = "";

    static function connect()
    {
        try {
            new PDO("mysql:host=" . $db_host . '; dbname=' . $db_name, $db_username, $db_password);
            setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $db_error) {
            echo $db_error->getMessage();
        }
    }
}
?>

【问题讨论】:

  • 这与你的方法有关,它是static

标签: php oop


【解决方案1】:

您不能从静态函数访问非静态实例字段(但您可以从非静态方法访问静态实例字段和函数)。而且,你误用了“setAttribute”功能。

您应该将实例变量设为静态并使用 self 关键字:

class database
{
    private static $db_host = "...";
    private static $db_username = "...";
    private static $db_password = "...";
    private static $db_name = "...";

    public static function connect()
    {
        try {
            $dbConnection = new PDO("mysql:host=" . self::$db_host . '; dbname=' . self::$db_name, self::$db_username, self::$db_password);
            $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $db_error) {
            echo $db_error->getMessage();
        }
    }
}

或者,使您的函数非静态并使用 $this 关键字关联到类变量:

class database
{
    private $db_host = "...";
    private $db_username = "...";
    private $db_password = "...";
    private $db_name = "...";

    public function connect()
    {
        try {
            $dbConnection = new PDO("mysql:host=" . $this->db_host . '; dbname=' . $this->db_name, $this->db_username, $this->db_password);
            $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $db_error) {
            echo $db_error->getMessage();
        }
    }
}

您将如何处理“dbConnection”变量?现在它没有任何用途。你应该return它,或者用它绑定另一个实例字段。

【讨论】:

  • 仍然错误:致命错误:不在对象上下文中使用 $this。更改为公共函数并使用 $this-> 作为我的变量。
  • 不可能。检查您不再有静态关键字,并查看我对“setAttribute”函数的编辑。
  • dbConnection 变量不是我写的,我没有使用它。但你在这里有答案。实例变量静态并使用自我!
  • 伟大的@Johnny。我添加了这个“dbConnection”变量,因为方法 setAttribute 属于 PDO 对象,你应该对这个对象采取行动。
猜你喜欢
  • 2019-09-18
  • 2015-11-17
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2012-03-04
  • 2011-09-14
相关资源
最近更新 更多