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 を上書きしてその中のオブジェクトを返すような汚い、ハッキーなものは必要ありません
ご協力とご意見をお寄せいただきありがとうございます