1

我很难理解 PHP 和 OOP 的概念。假设我有一个类,年,它与数据库中的年相匹配。我正在使用 PDO 连接数据库并执行查询。目前,它的设计使年类还包含一个名为“getAllYears”的方法,该方法执行 SQL 查询以获取我想要的格式的所有年份。然后我遇到的问题是如何遍历所有年份,同时确保我可以从年份类中访问它们。例如,我想这样称呼:

$years->getAllYears()

然后在我的应用程序主体中循环遍历它们,像这样引用它们:

$years->yearID; $years->yearName;

等等

我是否遗漏了一些关于 OOP 的基本知识(可能会拆分从数据库年份获取所有内容以及返回的对象),还是有办法做到这一点?

4

2 回答 2

2

如果$years->getAllYears()返回 iterable 并且yearIDyearName都是单个项目的属性,那么只需执行以下操作:

foreach ($years->getAllYears() as $year) {
    // use it, $year is now a single instance
    echo $year->yearID;
    echo $year->yearName;
}

如果您询问如何getAllYears()在适当的实例上进行迭代,请查看以下内容:

  • Iterator接口- 允许您迭代任何内容,而无需先将其设为数组(因此,您无需一次处理所有内容并将结果存储在内存中);在 PHP 5.5 及更高版本中,您可以使用生成器语法
  • PDOStatement::fetchObject()- 允许您从 PDO 语句中获取对象,并且您可以为其设置类,

这些元素组合在一起(迭代器在每次迭代时获取特定类的下一个对象)将为您提供您想要的。此外,这非常类似于一些现有的 ORM,因此您可能希望查看它们:例如。Zend 的 ORM 区分了表示表和行的类(参见此处)。

于 2013-08-04T11:05:22.707 回答
0

为了补充@Tadeck的答案,特别是关于如何实现可遍历对象的评论部分。我之所以提到stdClass具体是因为PDOStatement实现了Traversable接口的PDO能力。这意味着实例(由PDO::query()PDO::prepare()返回)可以用于数组特征函数,如(从 PHP 5.1 开始)。PDOStatementforeach

因此,该方法getAllYears不应由任何人实施stdClass。唯一getAllYears应该具有的功能是准备并返回一个实例,该PDOStatement实例启动以将每一行结果作为对象返回(因此使用 stdClass 作为匿名对象),以便在 foreach 示例中使用(使用object operatoras in $year->yearID)。

OPYears类将有一个称为getAllYears()查询结果的方法。 实现示例

// an example of the Years class implementing getAllYears
class Years {

  public function getAllYears() {
    // pseudo variable representing your original PDO object 
    // being used somehow.
    $conn = new PDO();

    // prepare a statement selecting all years
    $stmt = $conn->prepare(" select all years ");

    // set the fetch mode to return an anonymous object,
    // mapping column names to properties, on each iteration
    $stmt->setFetchMode(PDO::FETCH_OBJ);

    // return the statement if no SQL errors occurred
    // implement the way you would handle any SQL errors
    if(!$stmt->execute())
      throw new Exception('exception thrown: SQL error');

    return $stmt;
  }
}

演示:

$Years = new Years;
// the PDOStatement returned can be immediately used for iteration
foreach($Years->getAllYears() as $year) {
  // $year represents an anonymous object, each column is a property
  // of this object
  $year->yearID;
  $year->yearName;
}
于 2013-08-04T12:56:48.650 回答