PHP PDO::FETCH_LAZY -不创建对象变量名,因为他们被访问


PHP PDO::FETCH_LAZY - not creating object variable names as they are accessed

我正在使用PDO,无法理解PDO::FETCH_LAZY。在PHP手册中,它说"…PDO::FETCH_LAZY在对象变量名被访问时创建它们…"我用下面的代码来测试:

<>之前b类{函数__construct () {}}$b = new b();$pdo = new pdo ('mysql:host=localhost;dbname=test', 'username', ' password ');//testtable{id int,标题varchar, MSG varchar,时间varchar}$res = $pdo->查询("SELECT * FROM testtable limit 1");$res->fetch(PDO::FETCH_LAZY);echo $ b ->味精;var_dump ($ b);之前

这应该打印对象b只有一个属性,msg。但是,输出是这样的:

<>之前这是一个示例消息。object(PDORow)#6 (5) {["属性"]=>字符串(31)"SELECT * FROM testtable limit 1"[" id "] =>字符串(1)"1"["标题"]=>字符串(5)"样本"("味精")=>字符串(13)"这是一条样本信息。"["时间"]=>字符串(7)"1232123"}之前有谁能解释一下吗?谢谢。

PDORow是一个文档很少的内部类。它甚至不在手册(搜索结果)中。

查看PDORow的唯一方法是FETCH_LAZY:

$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->bindValue(':id', 1, PDO::PARAM_INT);
$stmt->execute();
$lazy = $stmt->fetch(PDO::FETCH_LAZY);
有趣的是,它的所有属性都是公共的。第一个是"queryString",它与sql查询相关联。它是某种代理。

您可以在进一步的语句中重用它,以获得完整的对象。获取PDORow(几乎)不会增加内存使用。它是不可序列化的,并且调用它的undefined属性不会引发错误。

更多信息请访问phpdelusions.net

当使用fetch lazy时,从PDO返回的对象不是标准类对象,它们是pdoow类型的,并且具有一些神奇的特性,包括延迟数据获取-这与pdo_ drivers的设置方式有点模糊

你可以关注这个有趣的讨论。

从php-src中,我们可以看到PDORow不是要被实例化的

您可以在pdo_stmt.c中看到该类的一些详细信息其余部分按Ctrl+F PDORow

编辑

FETCH_LAZY的一个可能用例是:

// get the lazy object - aka, PDORow
    $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
    $stmt->bindValue(':id', 100, PDO::PARAM_INT);
    $stmt->execute();
    $lazy = $stmt->fetch(PDO::FETCH_LAZY);

下一步,重用它:

// do whatever you please with the properties, since they're all public
   $publicProps = get_object_vars($lazy);

然后,如果你需要的话,加载真正的对象:

// loading lazy object
    $stmt = $pdo->prepare($publicProps['queryString']);
    $stmt->bindValue(':id', $publicProps['id'], PDO::PARAM_INT); 
    /** you could use a regex to get an array of parameters' names prefixed by ':' in the original queryString
    * eg, $queryString = 'SELECT * FROM users WHERE firstName = :firstName AND email = :email';
    * preg_match_all('/:[^'s]+/', $queryString, $matches);
    * would give you an array with ":firstName" and ":email"
    */
    $stmt->execute([':id' => $publicProps['id']]);
    $notLazy = $stmt->fetch();

in line

$b = $res->fetch(PDO::FETCH_LAZY);

你给变量$b一个新的值(PDORow对象)覆盖'b'对象