多个函数是PHP中的一个重要功能?

时间:2012-10-24 11:24:54

标签: php mysql oop crud

所以我正在编写DataBase类,它将是PHP ControllerMySQL View之间的封装层。

interface iDataBase {
    public function drug($action, $drug);
    public function company($action, $company);
    public function activeIngredient($action, $activeIngredient);
}

首先,我想让所有的setter和getter分开,如getAllDrugs(),updateDrug(),removeDrug(),getForUpdate(),getDrug()等等,但后来我意识到我也在污染数据库界面很多功能,加上这是一个非常小规模的版本,我正在考虑添加更多的类和更多的功能。所以,我没有使用很多函数,只是设置为3 $action将决定用户想要用某个类做什么样的事情。所以,目前可能的行动包括:"add", "getAll", "getForUpdate", "update", "remove"

$action掩盖的这些函数有不同的事情要做,所以它们的返回结果不同,第二个参数也可以不同。

我的解决方案是一个好习惯吗?我相信很多人都有同样的问题,你是怎么解决的?有任何可能的问题吗?

P.S。 Drug, Company, ActiveIngredient都是类

4 个答案:

答案 0 :(得分:3)

一个功能应该有明确定义的,狭隘的职责,明确定义的极简主义回报类型。如果你开始创造“上帝的功能”,它可以做任何事情,厨房下沉取决于你传递的论点,你将大量进入难以维护意大利面条代码的领域。你不想要一个做A的函数,如果你把它传给X就返回B,但是如果你把它传给Y就做C并返回​​D ......等等。

当你看到类似的模式出现时,启动具体并随着时间的推移进行概括是一个好主意。因此,创建您实际需要的方法:

public function findUserById($id)
public function findUserByEmail($email)
public function updateCompanyName($id, $newName)

如果您发现这些功能之间共享代码,请在幕后统一代码以使其保持干燥状态:

public function findUserById($id) {
    return $this->find('SELECT * FROM user WHERE id = ?', $id);
}

public function findUserByEmail($email) {
    return $this->find('SELECT * FROM user WHERE email = ?', $email);
}

protected function find($query, $arg) {
    ...
}

不要反过来开始,认为你“只需要X,Y和Z”,它们似乎足够相似,可以统一到一个方法中,然后发现X,Y和Z之间存在细微差别并乱扔垃圾你的代码,每个特殊情况。这只会带来巨大或一般的功能,它们基本上什么都不做。

答案 1 :(得分:2)

你可能正在寻找的是TableDataGateway(强调我的):

  

表数据网关保存用于访问 或查看的所有SQL:选择,插入,更新和删除。其他代码调用其方法与数据库进行所有交互。

这意味着您将拥有一个通用数据库适配器,例如PDO对象。你把它注入你的各种TDG。然后,TDG将该适配器用于数据库中的CRUD数据。

实施例

class CompanyTableGateway
{
    private $dbAdapter;

    public function __construct(DBAdapter $dbAdapter)
    {
        $this->dbAdapter = $dbAdapter;
    }

    public function create($name, $street, $whatever)
    {
        $this->dbAdapter->exec( 'INSERT INTO companies …' );
    }

    public function findById($id) 
    {
        return $this->dbAdapter->exec(
            sprintf('SELECT * from companies where id = %d', $id)
        );
    }

    // more methods …
}

如果您有多个这些网关,则可以将常规CRUD逻辑抽象为Abstract类,然后从中扩展具体网关。

然后,您将使用TableModule或类似的其他对象来调用各个网关上的方法。

答案 2 :(得分:1)

关于分离关注与单一责任原则的永无止境的讨论。

尽量充分利用两者,并相应地为您的课程建模。

答案 3 :(得分:1)

我建议你做的是做一个全局数据库类,它控制数据库的基本输入/输出,然后将其扩展到每个表。

此示例可以是Users表。您可以对此表做什么

  1. 创建
  2. 更新
  3. 删除
  4. 然后,您将使用Users Class扩展超级数据库类,该类将为您希望拥有的每个函数提供getter和setter,即:

    class Users extends DatabaseClass {
        public function update ( $params )
        {
            // Make the code for an update, and let the SuperClass execute the code.
            ...
        }
    
        public function add ( $params )
        {
            ...
        }
    
        public function delete ( $params )
        {
            ...
        }
    }
    

    这将允许您以后轻松地向Users表添加更多功能,并针对您正在使用的表/数据优化查询。