Php 如何使一个类的实例成为另一个类的实例
我有一个自定义的db类,它扩展了MySQLi类 MySQLi->query()方法返回带有MySQLi_Result类的obejct,但我想扩展这个类的函数性,并以某种方式使Result对象成为MyResult类。大概是这样的: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 /*
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结果
类,而是查询数据的自定义对象。接受此答案。结合评论,它解决了我的问题。