【发布时间】:2012-11-16 13:50:26
【问题描述】:
PHP mysqli_result 类实现 Traversable 接口已有一段时间了。 这提供了一些有趣的可能性,例如以下代码:
<?php
$db = new mysqli( '...' );
$result = $db->query( '...' );
foreach( $result as $row ) {
//$row is an associative array containing the fetched values
}
现在,我非常喜欢这个,但在我目前正在开发的库中,我希望获取对象,而不是关联数组。我还希望能够将一个类传递给它,这样我就可以用它创建一个简单的模型系统
为此,我像这样扩展它:
<?php
class mysqli_result_extension extends mysqli_result {
protected $result_class;
public function set_result_class( $class ) { $this->result_class = $class; }
public function function_to_overwrite() {
return $this->fetch_object( $this->result_class );
}
}
我的问题和我的问题:
我现在如何从 fetch_assoc 切换到 fetch_object? 我想覆盖 Traversable 接口用来返回结果的方法,但它没有定义任何(http://php.net/manual/en/class.traversable.php)
那么我需要覆盖什么才能从 fetch_assoc 切换到 fetch_object 并能够将我的 $result_class 传递给它,以便我能够执行以下操作:
<?php
$db = new mysqli_extension( '...' );
$posts = $db->query( 'select * from posts' );
//$result is object of type mysqli_result_extension
$posts->set_result_class( 'post' );
foreach( $posts as $post ) {
//$post is an instance of class 'post'
}
我不想要一些肮脏的东西,比如覆盖 fetch_assoc 并只返回其中的对象
提前感谢您的帮助和意见
【问题讨论】:
-
您可以切换到 PDO 吗?不知道如何在 MySQLi 中执行此操作,但使用 PDO 可以轻松完成您想要的操作。只需设置
PDO::ATTR_DEFAULT_FETCH_MODE属性,它会在您执行foreach 循环时执行适当类型的获取。 -
如果我还能够指定结果对象的类,这将是一个很好的解决方案。我搜索了 PDO 的文档,但找不到方法。 Afaik 扩展 PDOStatement 类会导致与扩展 mysqli_result 相同的问题,因为它也实现了 Traversable
-
是的,你可以。我会用代码将其作为答案发布。