PHP OOP数据库结果
我很难理解PHP和OOP的概念。假设我有一个类,years,它与数据库中的years匹配。我使用PDO连接数据库并执行查询。目前,它的设计使得years类还包含一个名为“getAllYears”的方法,该方法执行SQL查询以获得我想要的格式的所有年份。然后我的问题是如何循环所有年份,同时确保我可以从years类访问它们。 例如,我想称之为:PHP OOP数据库结果,php,oop,Php,Oop,我很难理解PHP和OOP的概念。假设我有一个类,years,它与数据库中的years匹配。我使用PDO连接数据库并执行查询。目前,它的设计使得years类还包含一个名为“getAllYears”的方法,该方法执行SQL查询以获得我想要的格式的所有年份。然后我的问题是如何循环所有年份,同时确保我可以从years类访问它们。 例如,我想称之为: $years->getAllYears() 然后在我的应用程序主体中循环引用它们,如下所示: $years->yearID; $years-&
$years->getAllYears()
然后在我的应用程序主体中循环引用它们,如下所示:
$years->yearID; $years->yearName;
等等
我是否遗漏了OOP的一些基本内容(可能是将从数据库年份获取的所有内容和返回的对象分割开来),或者是否有办法做到这一点?如果
$years->getAllYears()
返回iterable和yearID
和earName
都是单个项目的属性,那么就这样做:
foreach($years->getAllYears()作为$year){
//使用它,$year现在是单个实例
echo$year->yearID;
echo$year->earName;
}
如果您想了解如何使getAllYears()
在适当的实例上可用,请查看以下内容:
- -允许您迭代任何内容,而无需首先将其设置为数组(正因为如此,您不需要一次处理所有内容并将结果存储在内存中);在PHP5.5及更高版本中,您可以使用
- -允许您从PDO语句中获取对象,并且可以为其设置类
这些元素组合在一起(迭代器在每次迭代中获取特定类的下一个对象)将为您提供所需的内容。此外,这非常类似于一些现有的ORM,因此您可能希望看看它们:例如,Zend的ORM在表示表和行的类之间有区别(请参见)。补充@Tadeck answer,特别是关于如何实现可遍历对象的部分。我之所以提到
stdClass
是因为实现接口的能力。这意味着PDOStatement
实例(由and返回)可以用于具有数组特性的函数,如foreach
(从PHP5.1开始)
因此,任何stdClass
都不应实现方法getAllYears
。getAllYears
应该具有的唯一功能是准备并返回一个PDOStatement
实例,该实例被启动以将每一行结果作为对象返回(因此使用stdClass作为匿名对象),以便在foreach示例中使用(使用对象操作符
,如$year->yearID
)
OPYears
类将有一个名为getAllYears()
的方法来查询结果。
实施示例:
演示:
请详细说明OP如何能够返回从SQL操作返回的iterable(stdClass)。@dbf:我假设问题只是迭代。将为答案添加更多信息。非常感谢您的回答。我希望这篇文章能在将来对某些人有所帮助。@dbf:Done。还请注意,
stdClass
不会提供OP提到的能力,仅仅因为它没有他想要的方法(stdClass
没有getAllYears()
方法),也不会以OP想要的方式适用stdClass
更适合作为单个项目。@adamcopard:我很高兴我帮了忙。祝你好运
// 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;
}