编写自适应PHP方法?

时间:2013-03-09 15:14:32

标签: php class design-patterns methods

假设我有一个名为Books的课程。在该课程中,我有一种方法可以获取一本书或几本书的标题,价格和类别。所以像这样:

public function fetchRows () {
  $sql = $con->prepare("SELECT Title, Price, Category FROM Books");
  $sql->execute();
  return $sql->fetchAll();
}

一切都很好,但是我们现在想要获取另一行,order结果和limit返回的行数。为此编写另一种方法会起作用,但那会导致一些荒谬的方法,而且只是凌乱而且不符合DRY规则。我可以使用参数来自定义prepare语句,然后我可能最终会在参数中编写整个查询,而且看起来似乎并不牢固。

我的问题是如何编写/构造适应最终用户试图获得的方法/类?

很抱歉,这对特定问题不是一个问题。我已经阅读了一些关于我的问题的材料,但是我很难将这种模式包裹在我的头脑中,我希望有人可以提供一些解释或示例来帮助我理解这一点。

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用位于数据库顶部的ORM(对象关系映射器)?我强烈推荐Doctrine 2 http://www.doctrine-project.org。这样,您可以将数据库表中的行视为对象:所有数据库交互都被抽象掉了(如果需要,您仍然可以直接运行SQL查询)。

如果您不熟悉ORM的概念,Doctrine允许您编写如下代码:

$user = new User();
$user->username = 'test';
$user->email = 'test@example.com';
$entityManager->persist($user);
$entityManager->flush();

您只需运行INSERT INTO user (username, email) VALUES ('test', 'test@example.com');而无需编写任何SQL。

同样,可以按如下方式检索用户:

$user = $entityManager->getRepository('User')->findOneByUsername('test')

$user = $entityManager->getRepository('User')->findOneByEmail('test@example.com')

根据用户表中的字段自动为您生成这些查找程序方法,帮助您保持代码DRY。

答案 1 :(得分:-1)

  

适应最终用户想要获得的内容?

你在这里进入摇摇欲坠的理由。您可能希望允许最终用户访问数据库层,以便她可以准备查询。

否则你开始重新发明轮子。而且我怀疑你真的拥有那么多功能,说实话。

所以这在很大程度上取决于您的最终用户。如果最终用户希望做得多,请以源代码形式提供软件,以便最终用户可以根据需要修改软件。

在此之前,发布您的软件并从最终用户那里获得真实需要的功能。

对你的应​​用程序说ORM可能只是一个无用的开销,但你只需要在PDO之上的一些更多功能,如延迟查询和稍后重命名列名的一些功能。

$result = PDOQuery::create('* FROM config')->limit(2);

$result->orderBy('`option`');

$result->aliasNames(['option' => 'name'], $removeOther = true);    

foreach ($result as $row) {
    print_r($row);
}

这只是示例,代码只是将行提供为assoc数组:

Array
(
    [name] => Insert Option 50e60ca17bdf4
)
Array
(
    [name] => Insert Option A 50e78a79ead49
)

仅在涉及foreach时执行(例如,您可以将其传递到视图中,如果视图不需要它,则永远不会执行数据库查询)。

您可以进一步扩展它,例如定义查询的所有内容都将成为您可以传递的查询定义。

您可以使迭代器成为堆叠迭代器,以便在执行查询时可以对结果应用限制,而不是再次运行查询。什么不是。

所有这些实际上都是根据您的需求增强PDO的界面,因此您需要自己编写该组件。

它应该比上面的示例代码中概述的更加分离。