2

当用户单击按钮时,我的脚本会实例化此类。因此,如果我的网站上有 50 个用户单击此按钮,那么将有 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();
        }
    }
}
4

3 回答 3

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);
}
于 2013-04-16T14:17:32.603 回答
1

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

这是基于 HTTP 的通信的固有属性:无状态;而 PHP 是在 HTTP 协议上运行的,所以它受到它的限制。

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

因此,无法通过多个不同的连接将您的课程保存在内存中。

于 2013-04-16T14:18:01.903 回答
0

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

于 2013-04-16T14:13:11.103 回答