fetchObject()

1. 定义

该方法获取PDOStatement结果集中下一行的数据,并将其作为一个对象返回。 失败时返回 FALSE。

注:

  • 该方法相当于PDOStatement::fetch(PDO::FETCH_CLASS)PDOStatement::fetch(PDO::FETCH_OBJ)
  • 当传入用户自定义的类时,类必须存在,否则将发出一个致命错误
  • 返回的结果为指定类属性与列的并集(如果类属性名称与列名一致则赋值)
  • 类的非公开属性也可以赋值
  • 列值先覆盖属性值,后执行构造函数,也就是说,传入的构造函数的参数列表将覆盖行数据

2. 语法

PDOStatement::fetchObject ([ string $class_name = "stdClass" [, array $ctor_args ]] ) : mixed

3. 参数说明

参数 可选性 数据类型 描述
$class_name 可选 字符串 返回对象的类名,默认为匿名类stdClass
$ctor_args 可选 数组 返回对象的类的构造函数的参数列表

4. 示例

<?php

// PDOStatement::fetchObject()
// 获取`PDOStatement`结果集中下一行的数据,并将其作为一个对象返回

class Movie
{
    public $name = '';
    private $rate = 9.0;
    public $extend;

    public function __construct($name = '电影名称', $rate)
    {
        $this->name = $name;
        $this->rate = $rate;
    }
    public function getName()
    {
        return $this->name;
    }
}

try {
    $config = ['driver' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'charset' => 'utf8', 'user' => 'root', 'pwd' => 'mysql'];
    $dsn = sprintf('%s:host=%s;dbname=%s;charset=%s', $config['driver'], $config['host'], $config['dbname'], $config['charset']);
    $conn = new PDO($dsn, $config['user'], $config['pwd']);
} catch (PDOException $e) {
    error_log($e->getMessage());
    echo $e->getMessage();
}

try {
    $sql = 'SELECT `name`,`rate`,`cover`,`url` FROM `movie` WHERE `id` > 15 ORDER BY `id`';
    $stmt = $conn->prepare($sql);

    $stmt->execute();
    $res = $stmt->fetchObject();// 获取下一行的数据,并将其转为匿名类的对象
    var_dump($res);
    /* 输出:
    object(stdClass)#3 (4) {
      ["name"]=>
      string(12) "头号玩家"
      ["rate"]=>
      string(3) "8.7"
      ["cover"]=>
      string(74) "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2516578307.jpg"
      ["url"]=>
      string(41) "https://movie.douban.com/subject/4920389/"
    }
    */

    $res = $stmt->fetchObject('Movie', ['name', 'rate']);
    var_dump($res);
    /* 注意,这里可以看出,传入构造函数的值覆盖了行中原来的数据
    object(Movie)#4 (5) {
      ["name"]=>
      string(4) "name"
      ["rate":"Movie":private]=>
      string(4) "rate"
      ["extend"]=>
      NULL
      ["cover"]=>
      string(74) "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2539661066.jpg"
      ["url"]=>
      string(42) "https://movie.douban.com/subject/27110296/"
    }
    */
} catch (Exception $e) {
    echo "发生了错误:", $e->getMessage();
}

5. 延展阅读