Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP数据库结果_Php_Oop - Fatal编程技术网

PHP OOP数据库结果

PHP OOP数据库结果,php,oop,Php,Oop,我很难理解PHP和OOP的概念。假设我有一个类,years,它与数据库中的years匹配。我使用PDO连接数据库并执行查询。目前,它的设计使得years类还包含一个名为“getAllYears”的方法,该方法执行SQL查询以获得我想要的格式的所有年份。然后我的问题是如何循环所有年份,同时确保我可以从years类访问它们。 例如,我想称之为: $years->getAllYears() 然后在我的应用程序主体中循环引用它们,如下所示: $years->yearID; $years-&

我很难理解PHP和OOP的概念。假设我有一个类,years,它与数据库中的years匹配。我使用PDO连接数据库并执行查询。目前,它的设计使得years类还包含一个名为“getAllYears”的方法,该方法执行SQL查询以获得我想要的格式的所有年份。然后我的问题是如何循环所有年份,同时确保我可以从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

OP
Years
类将有一个名为
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;
}