当用户单击按钮时,我的脚本会实例化此类。因此,如果我的网站上有五十个用户单击此按钮,那么将会有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();
}
}
}
答案 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)
每次使用不同的凭据(参数)时,都需要实例化该类。因此,如果每个用户都使用不同的凭证创建新连接,那么您需要每次实例化。否则,您必须进行适当的检查并继续使用相同的连接