Cit*_*zen 6 php mysql database class
很久以前应该问过这个人.
在另一个类中使用其他类的最佳方法是什么?
例如,假设我有一个应用程序类:
class Application
{
public function displayVar() {
echo 'hello world';
}
}
Run Code Online (Sandbox Code Playgroud)
和一个数据库类
class Database
{
// connects to db on construct
public function query() {
// queries db
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想在我的应用程序类中添加一个函数,该函数使用db类中的函数
class Application
{
public function displayVar() {
echo 'hello world';
}
public function getVar() {
global $db;
$sql = foo;
$db->query($sql);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我有
$db = new Database();
$app = new Application();
$app->getVar('var');
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?我真正想要的是标准的做法,而不是另一种操纵方式.
Anu*_*rag 12
有几种方法可以做到这一点.全局变量当然是一种方式,也是最容易被忽视的方式.您可以创建一个Singleton,并且需要数据库访问的所有其他类将调用此单例.
final class Database {
private static $connection;
public static function getInstance() {
if(self::$connection == NULL) {
self::$connection = // init your database connection
}
return self::$connection;
}
}
Run Code Online (Sandbox Code Playgroud)
并且在任何类需要它时使用此数据库连接对象.
class Application {
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$db = Database::getInstance();
$sql = foo;
$db->query($sql);
}
}
Run Code Online (Sandbox Code Playgroud)
这对于开始和使用全局变量之外的一个很好的步骤来说都很好,但是你可以使用依赖注入做得更好.依赖注入是一个简单的概念,如果一个类有任何外部依赖项,例如您的示例中的数据库连接,那么您可以在其构造函数或方法中将它们显式传递给有需要的类.所以新代码看起来像Jonathan的解决方案.使用依赖注入的一个主要优点是单元测试,您可以使用模拟对象轻松替换此实际数据库对象,并将其传递给任何需要它的人.
class Application {
private $db;
public function __construct(Database $db) {
$this->db = $db;
}
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$sql = foo;
$this->db->query($sql);
}
}
Run Code Online (Sandbox Code Playgroud)
对于较小的项目,您可以轻松地自己完成.对于大型项目,有各种可用于PHP的DI框架
| 归档时间: |
|
| 查看次数: |
10319 次 |
| 最近记录: |