1

PHP と OOP の概念を理解するのに苦労しています。データベース内の年と一致する年というクラスがあるとします。PDO を使用してデータベースに接続し、クエリを実行しています。現時点では、years クラスにも「getAllYears」というメソッドが含まれるように設計されています。このメソッドは、SQL クエリを実行してすべての年を必要な形式で取得します。私が抱えている問題は、年のクラスからそれらにアクセスできることを確認しながら、すべての年をループする方法です。たとえば、これを次のように呼びたいと思います。

$years->getAllYears()

次に、アプリケーションの本体でそれらをループし、次のように参照します。

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

OOP に関する基本的なこと (おそらく、データベースの年からすべてを取得することと返されるオブジェクトを分割すること) が欠けていますか、それともこれを行う方法はありますか?

4

2 に答える 2

2

$years->getAllYears()iterable とyearIDandが両方とも 1 つのアイテムのプロパティを返す場合はyearName、次のようにします。

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は、どの .xml ファイルでも実装しないでstdClassください。foreach の例で ( as のas を使用して) 使用するために必要な唯一の関数は、各行の結果をオブジェクトとして返すように開始されgetAllYearsたインスタンスを準備して返すことです (したがって、匿名オブジェクトとして stdClass を使用します)。PDOStatementobject operator$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 に答える