2013-08-04 166 views
1

我無法使用PHP和OOP理解我的頭。假設我有一個班級,年數與數據庫中的年數相匹配。我正在使用PDO連接數據庫並執行查詢。目前,它的設計是爲了讓年份類還包含一個名爲'getAllYears'的方法,它執行SQL查詢以按照我想要的格式獲取所有年份。那麼我現在面臨的問題是如何循環遍歷所有年份,同時確保我可以從年級獲得它們。 比如我想稱之爲:通過他們在我的應用程序的身體PHP面向對象數據庫結果

$years->getAllYears() 

,然後循環引用它們是這樣的:

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

我缺少的東西關於面向對象的基礎知識(也許是從數​​據庫年份和返回的對象中分離出一切)還是有辦法做到這一點?

回答

2

如果$years->getAllYears()回報迭代和yearIDyearName是單個項目的這兩個屬性,那麼就這樣做:

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

如果你問如何使getAllYears()超過適當的情況下可迭代的,看看這樣的:

  • Iterator interface - 讓你遍歷任何東西,而不需要使陣列第一(和感謝的是,你不需要處理,一次就全部並存儲RESU在內存中);在PHP 5.5及更高版本,您可以使用generator syntax
  • PDOStatement::fetchObject() - 允許你從PDO語句獲取對象,您可以設置類的,

這些元素結合(迭代器獲取的下一個對象每次迭代的特定類)會給你你想要的。此外,這與現有的一些ORM非常相似,所以你可能希望看看它們:例如。 Zend的ORM在代表表格和行的類之間有區別(參見here)。

+1

將是很好的闡述OP如何能夠返回一個迭代(stdClass的)從SQL操作返回。 – dbf

+0

@dbf:我認爲問題只是迭代。不過,會在答案中增加更多信息。 – Tadeck

+0

非常感謝您的回答。我希望闡述能夠在將來幫助某人。 – etoipi

0

補充@Tadeck答案,特別是關於如何實現可遍歷對象的comment部分。我之所以提到stdClass是因爲PDOs的能力,PDOStatement實現了Traversable接口。這意味着PDOStatement實例(由PDO::query()PDO::prepare()返回)可用於數組特色功能,如foreach(自PHP 5.1起)。

該方法getAllYears不應該由任何stdClass執行。唯一的函數getAllYears應該準備並返回一個PDOStatement實例,以便將每個行結果作爲對象返回(爲此,將stdClass用作匿名對象),以便在以前的示例中使用(使用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; 
}