由 Phalcon Model 的 “bug” 引发的对 PHP Iterator 和 ArrayAccess 的探索
0x00 奇怪的现象
最近在写 Phalcon ORM 查询结果集遍历的时候发现 Phalcon ORM 有个很神奇的现象:当你用 foreach 遍历 Model->find() 之后的结果(Phalcon\Mvc\Model\Resultset\Simple
),如果在遍历中有访问下一个($key + 1)元素,就会自动执行 next(),下一个元素就不会出现在 foreach
的下一次遍历中了...
举个例子,比如说我们有一张表 users
,我们创建一个 User
model,执行如下代码:
<?php
$users = \Models\User::find([
'conditions' => 'role = 1' // 这里可以是别的查询条件
]);
// 这里假设查询出来的记录只有两条,即 count($users) == 2
foreach ($users as $key => $user) {
echo "key: $key, user_id: {$user->id}\n";
// 假设这里因为业务逻辑的需要访问下一个 model
$foo = $users[$key + 1];
}
你可能会觉得上面的循环在执行到第二次会报 PHP Notice: Undefined offset
,但实际上,它什么也没报,只是安安静静地输出了: