[英]PHP OOP Database Results
我很難理解PHP和OOP的概念。 假設我有一個班級,年份,它與數據庫中的年份匹配。 我正在使用PDO連接數據庫並執行查詢。 目前,它已被設計為,Years類還包含一個名為“ getAllYears”的方法,該方法執行SQL查詢以獲取我想要的格式的所有年份。 然后,我的問題是如何遍歷所有年份,同時確保可以從Years類訪問它們。 例如,我想這樣稱呼:
$years->getAllYears()
然后在我的應用程序主體中遍歷它們,如下所示:
$years->yearID; $years->yearName;
等等
我是否缺少有關OOP的基本知識(也許是從數據庫年度中獲取所有內容以及返回的對象),還是有辦法做到這一點?
如果$years->getAllYears()
返回iterable並且yearID
和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在表示表和行的類之間有所區別(請參閱此處 )。
為了補充@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.