【问题标题】:PHP mysqli connection class - can't access the connection variable outside. Scope issue [duplicate]PHP mysqli 连接类 - 无法访问外部的连接变量。范围问题[重复]
【发布时间】:2013-01-26 14:52:08
【问题描述】:

我不熟悉以 OOP 方式使用 PHP,但发现我的数据库连接类存在问题。

我这里有这个mysqli连接类的文件

$db_name = 'dbname';
$db_user = 'dbuser';        
$db_password = 'dbpassword';
$db_host = 'localhost';

class database {

    public $mysqli;

    public function connect($db_host, $db_user, $db_password, $db_name){

        $this->mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);

        if ($mysqli->connect_errno) {
            return "Sorry Andre, but you seem to have messed up the DB connection :(";
        }
    }
}

$newConnection = new database;
$newConnection->connect($db_host, $db_user, $db_password, $db_name);

然后我想在另一个文件的数据库连接中使用变量 $mysqli - 这是一个使用 $mysqli 变量连接的简单插入数据库。我在连接文件中包含了上述内容,但是当我在数据库类中调用该方法时,似乎没有返回 $mysqli 变量。我收到 PHP 错误提示...

Fatal error: Call to a member function prepare() on a non-object in...

我已经看到使用

global $mysqli; 

有效,但是我想以正确的方式来做,因为我听说这不是好的做法。

我知道我在这里做的事情可能有点错误,因为我是使用 OOP 的新手,但我认为通过在连接函数中返回该变量,我可以通过在外部创建类来访问它。

感谢您的帮助, 谢谢。

【问题讨论】:

    标签: php class variables scope


    【解决方案1】:

    在外部使用时,通过实例访问类变量...

    $newConnection = new database;
    $newConnection->connect($db_host, $db_user, $db_password, $db_name);
    $newConnection->mysqli /* here you have access from outside */
    

    从内部你使用关键字 $this...

    // like this from inside
    if ($this->mysqli->connect_errno) {
        return "Sorry Andre, but you seem to have messed up the DB connection :(";
    }
    

    如果您想保护您的变量不被外部访问使用:

      private $mysqli; 
      // instead of 
      public $mysqli;
    

    【讨论】:

    • 嘿伙计。我稍微改变了你对 '$mysqli = $newConnection->mysqli' 的回答,它可以工作。如果您想更改答案,我会投赞成票:) 非常感谢。
    • @Andre 或者您直接使用 '$newConnection->mysqli' 而不是将其值传输到另一个名为 $mysqli 的变量。
    【解决方案2】:

    你需要改变:

    $mysqli->connect_errno
    

    收件人:

    $this->mysqli->connect_errno
    

    【讨论】:

    • 嘿。谢谢,但这并不能解决问题。
    【解决方案3】:
    Fatal error: Call to a member function prepare() on a non-object in...
    

    这始终意味着,您调用该方法的对象不是对象。 在您的情况下:mysqli 未初始化。

    一般提示: connect 看起来像东西,应该在构造函数中。

    class d {
      public function __construct($db_host, $db_user, $db_password, $db_name){
        $this->mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
        if ($this->mysqli->connect_errno) {
          return "Sorry Andre, but you seem to have messed up the DB connection :(";
        }
      }
    
      public $mysqli;
    }
    
    $foo = new d('host', 'user', 'pass', 'dbname');
    $foo->mysqli->prepare("something");
    

    因此,当您获取此类的实例时,它会自动初始化。 同样这样,您每次想要初始化它时保存一行。

    【讨论】:

    • 嘿,为什么它需要在构造函数中?我对这一切有点陌生。
    • 谢谢。刚刚查看了有关构造函数的教程,现在一切都变得有意义了。
    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2022-01-05
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多