1

我需要一些关于如何为我正在处理的项目创建\处理数据库连接的建议\建议。我正在使用 PHP 5.4.3 为我的公司创建一个简单的工单系统,现在没有任何类型的身份验证,因为我还没有准备好应对这种复杂性。到目前为止,我正在计划以下结构

<? php
class Db {
    private static $dbh = null;

    static function open_connection() {
        self::$dbh = new PDO(... }

    static function query($sql) {
        $result = self::$dbh->... }

    static function fetch_array($result){
        ...}
...

}

class Workorder extends Db {

    protected static $table_name = ...
    ...

    public $wonum;  
    ...

    function instantiate {
    //return workorder objects
    ...}

    function findallwos {
    //find all work orders...
    ...}

...}

我认为这对于我需要显示所有工作订单或放入新工作订单的页面来说效果很好。但是我有一些页面需要非常简单的查询,例如,其中一个报告页面将只有我们为我们工作的 3 名技术人员的下拉列表,如果我使用全局 $dbh 变量,我可以这样做

function create_dropdown () {
    GLOBAL $dbh;

    $sql = "select...";
    $sth = $dbh->prepare($sql);
    $sth->execute();
    $arry = $sth->fetchAll(PDO::FETCH_ASSOC);
    .....

但我宁愿远离全局变量,因为最终我想为这个站点增加未来的复杂性,这可能不适用于全局变量。(包括具有身份验证等的多个用户)。所以我的问题是:

我不应该像我设计的那样使用 Db 类,而是使用某种 connection_factory 类来传递连接吗?(并且没有我的工作订单类是任何东西的扩展)

我应该只使用对 Db 类的静态调用来提取简单的查询吗?db::fetch_array...

或者大家还有什么建议吗?我遇到了很多不同的方法来解决这个问题,但理想情况下,我想设计这个,这样当我添加多个不同的用户时,我不必完全重新编码所有内容权限等

4

1 回答 1

1

我个人对您提供的代码设计的批评是您没有分离关注点并且没有抽象。不要犯以前很多人犯过的巨大错误,在代码中混合 SQL 语句、表示类型和业务逻辑。在某些时候,您可能想要切换数据库产品、创建移动版本、添加功能……然后您需要更改数十个文件。

为了防止这些事情发生,我建议采用这样的方法:

  • 为实体及其关系创建一个干净且轻量级的模型,此时不要关心持久性(即数据库)、访问控制等(例如Workorder,包含Employee...的类的简单类)
  • 编写在模型上定义必要的持久性操作的接口(即 saveWorkorder(Workorder $workorder)、getAllWorkorders()、loadWorkorder()、...)。在您的代码中,仅提及这些接口和它们提供的方法,而不是具体的实现
  • 现在,用某个 DB 实现持久化接口的类。不要忘记将基本的 DB 操作封装在一个类中,您将在许多持久性类中使用它们。

我希望我的回答不会太模糊,但软件设计是一个非常广泛的领域,很难在一个答案中涵盖所有方面。与所有关于软件设计的问题一样,没有正确或错误的解决方案,因为它在很大程度上取决于具体项目、需求、个人编码风格等......

附带说明一下,如果您打算做更多此类项目,花时间了解框架(如 Zend Framework、Symphony、CakePHP 等)可能会有所回报,因为它们为您提供了很多您可以开箱即用的现有功能,例如数据库连接器、视图和业务逻辑的分离,...

于 2012-06-06T05:26:39.253 回答