php - 从数据库中获取数据是一种获取方法吗?

标签 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 方法来设置私有(private)变量 firstPage。似乎我应该有一个 set 方法来执行此操作,但我真的不能有一个 set 方法只从数据库中获取一些设置,对吧?因为这个对象的用户应该能够假设已经在对象中定义了一个设置...

我应该怎么做?

最佳答案

我觉得你的做法还不错。最重要的是在您执行的构造函数中传递 $db。用户可以是构造函数的参数或方法本身,这取决于用户对于应用程序的“永久性”程度。

有几件小事我会改进:

  1. 对 PDO 对象使用类型提示。因此,任何使用您的“库”的人都知道应该注入(inject)什么样的对象。
  2. 几乎从不使用private 可见性,而是使用protected。因此,如果有人想扩展你的类,他仍然可以访问你的属性。
  3. 不要使用 isset/empty 来检查 $user,而是引入默认值。因此,任何调用您的方法并看到参数的人都知道发生了什么。
  4. 始终明确使用public 可见性。这是一个很好的做法,您不会混淆例如 Java 开发人员,他们默认使用 package
  5. 如果您真的想创建高质量的代码,请检查每种可能的错误状态,以免遇到 fatal error 。 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;
  }
}

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

关于php - 从数据库中获取数据是一种获取方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19616710/

相关文章:

sql-server - 在 Entity Framework 中处理 View 关系

c++ - 用于数据存储和分析的库

mysql - 基本的内部消息传递数据库设计

python - Python 中的不可变对象(immutable对象)可能具有弱引用

php - 动态站点安全风险

php - 循环遍历 PHPExcel 中的列和行以创建对象

php - 在 Laravel 5 中发送带有不同回复的电子邮件

javascript - 如何访问对象字面量中的内容?

php - PHP MySQLi OOP 中 "->"和 "::"之间的区别

javascript - 附加字段中的自动完成