php - 在 php 中正确使用其他类中的类?

标签 php mysql database class

早就该问别人了。

在另一个类中使用其他类的最佳方式是什么?

例如,假设我有一个应用程序类:

class Application
{
    public function displayVar() {
        echo 'hello world';
    }
}

和一个数据库类

class Database
{
    // connects to db on construct
    public function query() {
        // queries db
    }
}

现在,我想向我的应用程序类添加一个函数,该函数使用来自 db 类的函数

class Application
{
    public function displayVar() {
        echo 'hello world';
    }
    public function getVar() {
        global $db;
        $sql = foo;
        $db->query($sql);
    }
}

那么我有

$db = new Database();
$app = new Application();
$app->getVar('var');

有更好的方法吗?实际上,我正在寻找的是执行此操作的标准方法,而不是另一种操纵方法。

最佳答案

有几种方法可以做到这一点。全局变量当然是一种方式,也是最被看不起的。您可以创建一个 Singleton所有其他需要数据库访问的类都会调用这个单例。

final class Database {
    private static $connection;

    public static function getInstance() {
        if(self::$connection == NULL) {
            self::$connection = // init your database connection
        }
        return self::$connection;
    }
}

并在任何需要它的类中使用这个数据库连接对象。

class Application {
    public function displayVar() {
        echo 'hello world';
    }
    public function getVar() {
        $db = Database::getInstance();
        $sql = foo;
        $db->query($sql);
    }
}

这一切都很好,是一个开始,也是超越使用全局变量的重要一步,但您可以使用 Dependency Injection 做得更好.依赖注入(inject)是一个简单的概念,如果一个类有任何外部依赖,比如你例子中的数据库连接,你可以在它的构造函数或方法中显式地将它们传递给需要的类。所以新代码看起来有点像 Jonathan 的解决方案。使用依赖项注入(inject)的一个主要优势是在单元测试中,您可以轻松地将这个实际的数据库对象替换为模拟对象并将其传递给任何需要它的人。

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);
    }
}

对于较小的项目,您可以自己轻松完成。对于大型项目,有各种DI frameworks available for PHP

关于php - 在 php 中正确使用其他类中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2017911/

相关文章:

php - PHP-将2D数组中的一列转换为指定列名的1D数组

php - 返回给定 id 的所有行值

php - 定期更新和修改数据库中的数据php

php - 复杂的 SQL 查询 - 热门内容

php - 如何使用 php 从时间戳中删除时间

java - 将java应用程序编译为php插件

php - 无法登录我的哈希密码,但有一个用户可以登录

mysql - 帮我优化这个查询

mysql - 如何在存储过程 WHERE 子句中使用 IF/CASE 语句

php - Blueimp jQuery 文件 uploader 并将文件大小保存到数据库中