我有自定义的db类,它扩展了MySQLi类 MySQLi-> query()方法返回与MySQLi_Result类的obejct,但我想扩展此类的功能,并以某种方式使结果对象成为MyResult类。像这样:
class MyResult extends MySQLi_Result{
function abc(){
//...
}
}
class MyDB extends MySQLi{
function q($query){
return /*Here some magic*/ $this->query();
}
}
$db=new MyDB();
$res=$db->q('SEL...');
$res->abc();
怎么做?
编辑: 有人说这是重复的,但这里的问题更深入! 我需要$ result对象就像Mysqli_result类obect一样,所以旧代码可以工作。 所以我需要这个,我可以调用原始的Mysqli_result方法,如:
$res->fetch_assoc();
//but not
$res->result->fetch_assoc();
答案 0 :(得分:4)
您可以应用Decorator pattern 所以你的代码将是:
class MyResult {
private $result;
function __construct(MySQLi_Result $result)
{
$this->result = result;
}
//Here some methods that use $this->result as you wish
}
class MyDB extends MySQLi{
function q($query){
return new MyResult($this->query($query));
}
}
$db=new MyDB();
$res=$db->q('SEL...');
$res->myMethod();
答案 1 :(得分:0)
class MyDB extends MySQLi{
function q($query){
return new MyResult($this->query());
}
}
MyResult需要一个构造函数来存储query()的输出并根据需要包装它。
答案 2 :(得分:0)
可能是这样的。
class MyDb extends MySQLi {
function query($query) {
$result = parent::query($sQuery);
return new MyDbResult($result);
}
}
答案 3 :(得分:0)
我不确定我是否正确理解了你的问题,但它可能看起来像这样。
class MyResult extends MySQLi_Result{
function __Contstruct($ob)
{
return $this->abc($ob);
}
function abc($object){
//your magic
}
}
class MyDB extends MySQLi{
function q($query){
$ob = $this->query($query);
return new MyResult($ob);
}
}