Php 如何在OOP类中调用数据库连接函数?
我希望能够调用连接到数据库的函数,而无需创建多个对象,包括或必须在每个类中编写相同的构造。我基本上想在其他类中调用构造函数。 像下面这样Php 如何在OOP类中调用数据库连接函数?,php,Php,我希望能够调用连接到数据库的函数,而无需创建多个对象,包括或必须在每个类中编写相同的构造。我基本上想在其他类中调用构造函数。 像下面这样 class Database{ public function __construct(){ $this->conn = new mysqli("host", "user", "password", "db"); // Check connection if (!$this->conn) { d
class Database{
public function __construct(){
$this->conn = new mysqli("host", "user", "password", "db");
// Check connection
if (!$this->conn) {
die("Connection failed: ".mysqli_connect_error());
}
}
}
class User{
// call Database->__construct();
}
class OtherClass{
// call Database->__construct();
}
当然,这不是一个可行的办法,但我真的不知道什么是可行的办法
我想也许这会管用。但事实并非如此
在类中创建新数据库对象以构造连接
class Database{
public function __construct(){
$this->conn = new mysqli("host", "user", "password", "db");
// Check connection
if (!$this->conn) {
die("Connection failed: ".mysqli_connect_error());
}
}
}
class User{
$conn = new Database();
}
class DBConnection{
protected static $db;
private function __construct() {
try {
self::$db = new PDO( 'mysql:host=localhost;dbname=db_abc', 'root', '' );
//self::$db = new PDO( 'mysql:host=localhost;dbname=db_phonebook', 'root', 'QAZwsx2016!' );
self::$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch (PDOException $e) {
echo "Connection Error: " . $e->getMessage();
}
}
public static function getInstance() {
if (!self::$db) {
new DBConnection();
}
return self::$db;
}
public function __destruct() {
$db=NULL;
}
}
依赖注入或构造函数注入似乎是一个很好的解决方案。但我不知道它是否是为这样的东西,以及如何应用它
class Database{
public function connection(){
$this->conn = new mysqli("host", "user", "password", "db");
// Check connection
if (!$this->conn) {
die("Connection failed: ".mysqli_connect_error());
}
}
}
class User{
private $db;
public function __construct(Database $conn){
$this->db = $conn;
}
}
这是我为连接所做的
class Database{
public function __construct(){
$this->conn = new mysqli("host", "user", "password", "db");
// Check connection
if (!$this->conn) {
die("Connection failed: ".mysqli_connect_error());
}
}
}
class User{
$conn = new Database();
}
class DBConnection{
protected static $db;
private function __construct() {
try {
self::$db = new PDO( 'mysql:host=localhost;dbname=db_abc', 'root', '' );
//self::$db = new PDO( 'mysql:host=localhost;dbname=db_phonebook', 'root', 'QAZwsx2016!' );
self::$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch (PDOException $e) {
echo "Connection Error: " . $e->getMessage();
}
}
public static function getInstance() {
if (!self::$db) {
new DBConnection();
}
return self::$db;
}
public function __destruct() {
$db=NULL;
}
}
这是我如何使用另一个模型类的
class User{
private $db;
public function __construct() {
$this->db = DBConnection::getInstance();
}
public function getUsers(){
//....................
//....................
//$sql =
$query = $this->db->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$query->execute();
$customers = $query->fetchAll();
//return .........
}
如果你想要纯面向对象的方式,请看看工厂方法,看看门面设计模式,这一切都是关于你如何实现这一点
这是我的方法(简单的方法),但是为了更好地了解不同的设计模式。
这里有一篇有用的文章
及
创建singleton类以建立连接,然后在任何地方使用该类。定义为静态,这样就不需要实例化。如果需要,我可以发布一个singleton类的示例来建立db连接though@webDev我真的很感激你,我真的不知道你说的单身班是什么意思。看看这个例子:你必须花时间去理解它。一个简单的替代方法是,在PHP脚本开始时初始化一个全局范围的变量
$database
,其中包含数据库连接,然后在任何地方都使用它。为什么不呢?非常好。通过将$db设置为静态,一次只能使用一个数据库连接,对吗?通过定义多个连接单例类并将其包含在模型类中,可以拥有多个数据库连接。示例仅显示一个连接类。更新该类并创建另一个类。