1

我有一个名为 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 方法来从数据库中获取一些设置,对吧?因为这个对象的用户应该能够假设对象中已经定义了一个设置......

我该怎么做?

4

2 回答 2

1

我认为你的方法还不错。最重要的是传入$db构造函数,这是你做的。用户可以是构造函数或方法本身的参数,这取决于用户对于应用程序的“永久”程度。

有几件小事我会改进:

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

然后,您的代码将如下所示:

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

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

于 2013-10-27T10:07:34.230 回答
1

Getter 不应该改变对象的状态。但是,有时成员变量不是实际对象状态的一部分——而是用于内部缓存。你应该问问自己——是firstPage国家的一部分吗?类的用户是否应该关心它是否被设置?除了性能之外,对象的行为是否会根据其价值而有所不同?如果没有,则可以将其设置在吸气剂中。

于 2013-10-27T10:14:21.473 回答