如何使一个类的实例成为另一个类的实例

时间:2011-08-11 11:40:41

标签: php oop

我有自定义的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();

4 个答案:

答案 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);
  }
}