Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使一个类的实例成为另一个类的实例_Php_Oop - Fatal编程技术网

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

Php 如何使一个类的实例成为另一个类的实例,php,oop,Php,Oop,我有一个自定义的db类,它扩展了MySQLi类 MySQLi->query()方法返回带有MySQLi_Result类的obejct,但我想扩展这个类的函数性,并以某种方式使Result对象成为MyResult类。大概是这样的: class MyResult extends MySQLi_Result{ function abc(){ //... } } class MyDB extends MySQLi{ function q($query){ return /*

我有一个自定义的db类,它扩展了MySQLi类 MySQLi->query()方法返回带有MySQLi_Result类的obejct,但我想扩展这个类的函数性,并以某种方式使Result对象成为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_结果方法,如:

$res->fetch_assoc();

//but not
$res->result->fetch_assoc();
你可以申请 因此,您的代码将是:

 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();

类MyDB扩展了MySQLi{
函数q($query){
返回新的MyResult($this->query());
}
}


MyResult需要一个构造函数来存储query()的输出,并根据需要包装它。

可能是这样的

class MyDb extends MySQLi {
    function query($query) {
        $result = parent::query($sQuery);
        return new MyDbResult($result);
    }
}
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);
  }
}

我不确定我是否正确理解了你的问题,但它可能看起来像这样

class MyDb extends MySQLi {
    function query($query) {
        $result = parent::query($sQuery);
        return new MyDbResult($result);
    }
}
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);
  }
}

在MyResult中添加“fetch_assoc”方法可能会出现重复。它将委托给MySQLi_Result中的相同方法(函数fetch_assoc(){return$this->Result->fetch_assoc();})。好处是,您还可以将自己的逻辑添加到此函数中(例如,像计算页面的取回名称一样),认为您的旧代码仍然可以工作。@Mironor OP还可以使用
mysqli\u fetch\u对象(mysqli\u result$result[,string$class\u name[,array$params]]
但这不会返回自定义的
MySqli\u结果
类,而是查询数据的自定义对象。接受此答案。结合评论,它解决了我的问题。