我刚刚开始做OOP,所以如果有一个简单的解决方案,我会提前道歉。 基本上我需要在类中使用我的 $ mysqli 对象。我把它分成了两个文件。
config2.php
class Config
{
public $host = 'localhost';
public $username = '****';
public $password = '****';
public $database = '****';
function report_error($query)
{
$email = '*@hotmail.com';
$subject = 'MySQL error.';
$message = "IP: {$_SERVER['REMOTE_ADDR']} \n URL: http://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']} \n\n MySQL query: {$query} \n\n MySQL error: " . $mysqli->error();
mail($email, $subject, $message);
die('Oops, an error has occured. The administrator has been notified.');
}
}
$config = new Config();
$mysqli = new mysqli($config->host, $config->username, $config->password, $config->database);
if($mysqli->connect_error)
report_error($mysqli);
administration.php
require('includes/config2.php');
$mysqli->real_escape_string(); // Works out of scope.
class Account
{
public $username = $mysqli->real_escape_string(); // Doesn't work in scope.
public $password;
function login()
{
}
}
感谢帮助人员,我很感激:)。
答案 0 :(得分:3)
您应该将对象传递给Account
的构造函数,并将其另存为私有实例变量。
Account
直接依赖于mysqli
的实例,因此通过将其指定为构造函数中的必需参数来清除它是没有错的。这是唯一可以确保每当使用Account
时mysqli对象也存在的方法。如果您从全局状态访问它(通过具有静态访问器或通过直接访问全局范围),您永远无法保证它确实在那里。
答案 1 :(得分:0)
您应该封装$ mysqli对象并将其设为static
通常你会将DB封装在一个名为“DBConnection”或类似的类中。这个实例应该将真正的$ mysqli对象管理为singleton
in(非常)简短:
class Config
{
public $host = 'localhost';
[...]
public static $connectionObj
public static getConnection(){
if (!isset($this->connectionObj ){
$connectionObj = new mysqli($this->host, $config->this, $config->this, $this->database);
if($mysqli->connect_error){
report_error($mysqli);
}
}
return $this->connectionObj;
}
}
您可以从任何地方访问此对象:
$mysqlObj = Config.getConnection()
<强>声明:强> 这是非常简短的,未经测试的代码和数据库不应该进入配置类,而是它自己的数据库类,所有SQL函数都是方法,这只是为了重用你提供的代码