我需要多次实例化这个类吗?

时间:2013-04-16 14:09:17

标签: php mysql pdo

当用户单击按钮时,我的脚本会实例化此类。因此,如果我的网站上有五十个用户单击此按钮,那么将会有50个已经实例化的类。这是正确的做法吗?或者我是否需要检查此类是否已经过实例化,如果已经执行过,则不执行任何操作。

我在这里连接到我的数据库。 这节课还有更多内容,这只是一个片段。

class Database{
    private $host      = "localhost";
    private $user      = "rt";
    private $pass      = "";
    private $dbname    = "db";

    public function __construct(){
        // Set DSN
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
        // Set options
        $options = array(
                PDO::ATTR_PERSISTENT    => true,
                PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
        );
        // Create a new PDO instanace
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
        }
    }
}

3 个答案:

答案 0 :(得分:4)

  

这是正确的做法吗?

是。
这就是PHP的工作原理。运行50个PHP实例,50个连接到已建立的数据库等

  

我需要检查此类是否已在

之前实例化

你可以,但它会毫无用处,因为其他用户的点击将由完全独立的PHP流程处理,无论如何你都无法访问它。

这是构造函数

的略微改进版本
public function __construct(){
    // Set DSN
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
    // Set options
    $options = array(
            PDO::ATTR_PERSISTENT    => true,
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
    );
    // Create a new PDO instanace
    $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
}

答案 1 :(得分:1)

每次用户加载页面时都需要运行PHP脚本,每次有人加载页面时都无法实例化类。

这是基于HTTP的通信的固有属性:无状态;并且PHP是通过HTTP协议运行的,因此它受到了它的限制。

您可以使用数据库和会话(基本上只是使用唯一键作为文件名存储信息的文件)来模拟状态,但PHP脚本本身必须受到HTTP没有状态的限制

因此,没有办法让你的班级在几个不同的连接上保持记忆。

答案 2 :(得分:0)

每次使用不同的凭据(参数)时,都需要实例化该类。因此,如果每个用户都使用不同的凭证创建新连接,那么您需要每次实例化。否则,您必须进行适当的检查并继续使用相同的连接