从数据库中获取数据是get-method的事吗?

时间:2013-10-27 09:48:56

标签: php database oop

我有一个叫做Viewer的小班。这个类应该查看每个页面的正确布局或类似的东西......

我有一个名为getFirstPage的方法,当被调用时,此方法的用户将获得当前将页面设置为第一页的设置值。我在这里有一些代码,我认为它有效,但我并不是真的不知道我是以正确的方式做到的:

class Viewer {

private $db;
private $user;
private $firstPage;

function __construct($db, $user) {

    $this->db = $db;

    if(isset($user)) {
        $this->user = $user;
    } else {
        $this->user = 'default';
    }
}

function getFistPage() {
    $std = $db->prepare("SELECT firstPage FROM settings WHERE user = ':user'");
    $std->execute(array(':user' => $user));
    $result = $std->fetch();
    $this->firstPage = $result['firstPage'];

    return $this->firstPage;
}
}

我的get方法是从数据库中获取设置(到目前为止一直很好?)。问题是,然后我必须使用此get方法来设置私有变量firstPage。看起来我应该有一个set方法来做这个,但我真的没有一个set方法只从数据库中获取一些设置,对吧?因为此对象的用户应该能够假设已经在对象中定义了设置...

我该怎么做?

2 个答案:

答案 0 :(得分:1)

我认为你的方法并不差。最重要的是在构造函数中传递$db。用户可以是构造函数的参数或方法本身,它取决于用户对应用程序的“永久性”。

我会改进几件小事:

  1. 对PDO对象使用类型提示。因此,任何使用“库”的人都知道应该注入什么样的对象。
  2. 几乎从未使用private可见性,请改用protected。因此,如果有人想扩展您的课程,他仍然可以访问您的房产。
  3. 不要使用isset / empty来检查$ user,而是引入默认值。因此,任何调用您的方法并查看参数的人都知道发生了什么。
  4. 始终明确使用public可见性。这是一个很好的做法,你不会混淆那些默认为package的Java开发人员。
  5. 如果您真的想要创建高质量的代码,请检查每个可能的错误状态,这样您就不会遇到致命错误。 PDO::fetch可以返回false,您应该在以数组形式访问结果之前检查此错误状态。
  6. 如果您决定将$firstPage保存到对象状态,则应在下次调用该方法时重复使用它。但是,如果你编写一个常见的Web应用程序,我认为你真的不想把它放到对象状态。相反,只需返回结果。
  7. 然后,您的代码将如下所示:

    class Viewer {
    
      /** @var PDO $db */
      protected $db;
      protected $user;
    
      public function __construct(PDO $db, $user = 'default') {  
        $this->db = $db;
        $this->user = $user;
      }
    
      public function getFistPage() {
        $std = $this->db->prepare("SELECT firstPage FROM settings WHERE user = ':user'");
        $std->execute(array(':user' => $this->user));
        $result = $std->fetch();
    
        if ($result !== false) {
          return $result['firstPage'];
        } else {
          throw new YourException('Failed to fetch first page.');
          // or return false/null;
      }
    }
    

    编辑:你应该总是在构造函数中完全设置对象状态,你不应该在其中进行任何计算。另外,避免使用类似初始化的方法。在这种情况下,构造函数确保我们设置PDO和$user参数(对象状态)。然后,您可以在方法中进行计算而不传递其他参数(这很好,它支持对象封装)。

答案 1 :(得分:1)

Getters不应该改变对象的状态。但是,有时成员变量不是实际对象状态的一部分 - 而是用于内部缓存。你应该问自己 - firstPage是州的一部分吗?该类用户是否应该关心它是否已设置?除了表现之外,对象是否会根据其价值采取不同的行动?如果没有,可以将它设置在吸气剂中。