我对OOP很新,我有一个简单的问题:
我的代码中有以下类:
Class DB {
//contains all my mysqli stuff
}
Class A {
All functions within this class will need a db connection
}
如何在类中创建连接而无需在每个函数上创建新的数据库实例?
这甚至可能吗?
提前致谢。
答案 0 :(得分:0)
这里有一堆答案在技术上回答了这个问题,但他们都在教导不正确的方法。良好的OOP设计的一个重要部分是支持组合而不是继承。
如果您的A
类类似于需要使用数据库的模型,那么让该类扩展DB
是一个非常糟糕的主意。相反,您只想将DB
传递给A
的构造函数:
class A {
protected $db;
function __construct(DB $db) {
$this->db = $db;
}
}
现在A
中的每个方法都可以通过DB
访问$this->db
。
这也解决了为A
的每个实例打开多个数据库连接的问题(或将来如果您需要B
或C
类)。
A
本身不应该创建自己的DB
实例,但这应该通过任何结构A来注入。这称为依赖注入和另一个好的原则OOP设计。
答案 1 :(得分:-2)
对于class DB
,您可以设置数据库连接,例如开放式关。对于class A
,您可以使用class DB
将类设置为继承extends
的方法。由于您不需要从外部访问您的类,我已将class DB
中的方法(程序中的函数)更改为protected
,因为默认情况下,所有方法都是public
。
我还添加了Constructor的使用(如评论中所述),因此当从Class A
创建对象时,您的数据库连接将自动打开。就个人而言,我不会在构造函数中打开数据库连接,但这只是我的偏执狂。如果您有疑问,请确保关闭方法中的连接。
<?php
Class DB {
protected function conDB() { //Protected can only be accessed by same class or inherited class
echo "Open connection to DB";
}
protected function closeDB() { //Protected can only be accessed by same class or inherited class
echo "Connection Closed";
}
}
Class A extends DB { //Extends will use all methods from inherited class
function __construct() { //Constructer will run on Object creation and open connection to DB
$this->conDB();
}
public function selectDB() {
echo "<br>";
echo "Data Select Here!";
echo "<br>";
$this->closeDB(); //You will still need to close the DB Connection
}
}
从A类创建对象
$select = new A(); //Create Object
$select->selectDB();
输出调用A类
Open connection to DB
Data Select Here!
Connection Closed
阅读材料: