簡體   English   中英

PHP OOP數據庫結果

[英]PHP OOP Database Results

我很難理解PHP和OOP的概念。 假設我有一個班級,年份,它與數據庫中的年份匹配。 我正在使用PDO連接數據庫並執行查詢。 目前,它已被設計為,Years類還包含一個名為“ getAllYears”的方法,該方法執行SQL查詢以獲取我想要的格式的所有年份。 然后,我的問題是如何遍歷所有年份,同時確保可以從Years類訪問它們。 例如,我想這樣稱呼:

$years->getAllYears()

然后在我的應用程序主體中遍歷它們,如下所示:

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

等等

我是否缺少有關OOP的基本知識(也許是從數​​據庫年度中獲取所有內容以及返回的對象),還是有辦法做到這一點?

如果$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在表示表和行的類之間有所區別(請參閱此處 )。

為了補充@Tadeck的答案,特別是關於如何實現可遍歷對象的注釋部分。 為什么我提到的原因stdClass是特別是由於PDO的能力是PDOStatement對象實現Traversable的接口。 這意味着PDOStatement實例(由PDO :: query()PDO :: prepare()返回 )可以在諸如foreach數組功能函數中使用(從PHP 5.1開始)。

因此,任何stdClass都不應實現getAllYears方法。 getAllYears唯一應具有的功能是准備並返回一個PDOStatement實例,該實例啟動getAllYears返回的每一行結果作為一個對象(因此將stdClass用作匿名對象),以便在foreach示例中使用(使用object operator$year->yearID )。

OP Years類將具有一個名為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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM