【问题标题】:Call to a member function on a non-object with mysqli使用 mysqli 调用非对象上的成员函数
【发布时间】:2015-08-08 06:00:31
【问题描述】:

我开始学习如何在 PHP 中使用 OOP,目前我想创建一个如下所示的数据库类:

class Database{
  //Database connection variables
  private $DBHost = "localhost";
  private $DBUser = "username";
  private $DBPass = "password";
  private $DBName = "database3";
  public $DBCon;

  public function __construct(){
    $this->DBCon = new mysqli($this->DBHost,$this->DBUser,$this->DBPass,$this->DBName);
  }

  public function con(){
    return $this->DBCon;
  }

  public function __destruct(){
    $this->DBCon->close();
  }
}

我正在尝试与另一个名为 Application 的类进行交互:

include('Database.php');
class Application{
  public $DB;

  public function __construct() {
    $DB = new Database();
  }

  public function InsertName($Username){
  var_dump($this->DB->con());
    if($this->DB->con()->query("INSERT INTO Test (name) VALUES ($Username);") === TRUE){
      echo "Okay";
    }else{
      echo "Error";
    }
  }
}

但我收到错误Call to a member function con() on a non-object

顺便说一句,这是在 OOP 中与数据库交互的合适方式吗?

【问题讨论】:

  • 而不是 $this->DB->con()->query 尝试 $this->DB->query$DB->query 。请检查一次并告诉它是否正常工作?
  • 在您的 Application 类构造函数中,您正在使用 $DB = new Database(); 。它应该是$this->DB = new Database();,以便您稍后可以在插入函数中访问它。
  • @Adon 搞定了,构造实现错误。 DB在__construct中保存为局部变量而不是实例变量
  • 您似乎也没有办法将连接详细信息传递给 Database 构造函数。如何设置,例如DBHost

标签: php oop mysqli


【解决方案1】:

在 Application 类构造函数中,$DB 被分配了 new Database()

在这种情况下,这个变量被认为是一个局部变量,它的作用域是构造函数本身。

要将新数据库对象正确分配给public $DB 属性,您需要通过对象的$this 引用来访问它。

public function __construct() { $this->DB = new Database(); }

这样,您将能够在剩余的类方法中访问正确分配的公共属性。

【讨论】:

  • 正确。他的问题是 $DB 变量保持未初始化,而不是 mysqli 实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
相关资源
最近更新 更多