如果声明在范围之外,我如何在我的类中使用我的$ mysqli对象?

时间:2012-06-28 11:35:11

标签: php oop class scope mysqli

我刚刚开始做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()
    {

    }
}

感谢帮助人员,我很感激:)。

2 个答案:

答案 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函数都是方法,这只是为了重用你提供的代码