PHP mysqli连接类 - 无法在外部访问连接变量。范围问题

13 浏览
0 Comments

PHP mysqli连接类 - 无法在外部访问连接变量。范围问题

我刚开始使用面向对象编程的PHP,但在我的数据库连接类中遇到了问题。\n我有一个文件,其中包含这个mysqli连接类:\n

$db_name = '数据库名';
$db_user = '数据库用户';        
$db_password = '数据库密码';
$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 "对不起,Andre,但是你似乎弄乱了数据库连接 :(";
        }
    }
}
$newConnection = new database;
$newConnection->connect($db_host, $db_user, $db_password, $db_name);

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

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

\n我看到使用\n

global $mysqli; 

\n可以解决,但我想按照正确的方式来做,因为我听说这不是一个好的做法。\n我知道我在这里可能做错了一些事情,因为我刚开始使用面向对象编程,但我认为通过在连接函数中返回该变量,我可以从外部创建类时访问它。\n感谢您的帮助。

0
0 Comments

问题的原因是mysqli连接没有被初始化。解决方法是将连接放在构造函数中,这样在实例化类时会自动初始化连接。这样做还可以节省每次初始化连接时的一行代码。

构造函数的作用是在实例化类时自动执行一些初始化操作,所以将连接的初始化放在构造函数中是比较合适的做法。

下面是一个示例代码:

class Database {
  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, but there was an error connecting to the database :(";
    }
  }
  public $mysqli;
}
$foo = new Database('host', 'user', 'pass', 'dbname');
$foo->mysqli->prepare("something");

通过上述代码,当实例化Database类时,连接会自动初始化。这样就不需要每次使用连接时都手动初始化了。

希望这个解决方法对你有帮助。如果还有其他问题,请随时提问。

0
0 Comments

问题出现的原因是在访问连接变量时,没有使用正确的作用域。解决方法是将代码中的$mysqli->connect_errno改为$this->mysqli->connect_errno

在PHP中,类的成员变量需要使用$this关键字来访问。在给定的代码中,$mysqli是一个类的成员变量,因此应该使用$this->mysqli来访问。

通过使用$this->mysqli->connect_errno,我们可以确保在类的任何方法中都可以正确访问连接变量。这样,无论在哪个方法中,我们都可以通过$this->mysqli->connect_errno来获取连接错误的编号。这个修正能够解决原问题中无法在类的外部访问连接变量的问题。

0
0 Comments

PHP mysqli连接类 - 无法在外部访问连接变量。作用域问题

在使用类的实例化对象来访问类变量时,你可以从外部访问。例如:

$newConnection = new database;
$newConnection->connect($db_host, $db_user, $db_password, $db_name);
$newConnection->mysqli /* 这里你可以从外部访问 */

而在类的内部,你可以使用关键字$this来访问类变量。例如:

// 在类内部可以这样使用
if ($this->mysqli->connect_errno) {
    return "Sorry Andre, but you seem to have messed up the DB connection :(";
}

如果你想保护变量不被外部访问,可以使用private关键字声明变量,而不是public。例如:

private $mysqli; 
// 替代
public $mysqli;

另外,你可以直接使用`$newConnection->mysqli`,而不是将其值转移到另一个名为$mysqli的变量中。例如:

$mysqli = $newConnection->mysqli;

以上是关于PHP mysqli连接类中无法在外部访问连接变量的原因以及解决方法的总结。

0