0

php如何定义类似如下静态调用,并且通过箭头多级关联调用的类和函数

Db::name('name')->field('id,name')->where('id',1)->find()

小林 231
10月15日提问
1 个回答
3

已采纳
function name()
{
    //code...
    return new static();
}
function where()
{
    //code...
    return $this;
}
function field()
{
    //code...
    return $this;
}

鉴于楼主知识点薄弱,详细回答下:

第1步:
Db::name()调用的是\think\Db类的name(),但是该类没有name(),所以实际调用的是__callStatic()(知识点1)。

__callStatic()里调用的是self::connect()对象的name()self::connect()对象是new \think\db\connector\Mysql()。所以Db::name()实际调用的是(new Mysql())->name();

Mysql里也没有name(),所以实际调用的父类Connectionname()(知识点2)。

Connection里也没有name(),所以实际调用的Connection__call()(知识点3)。

Connection__call()调用的是$this->getQuery()name()$this->getQuery()对象是new \think\db\Query()

Query里有name(),所以Db::name()实际调用的是(new Query())->name();

第2步:

因为Query里的name()返回return $this;。所以->field('id,name')调用的是Query里有field()(知识点4)。

第3步:

因为Query里的field()返回return $this;。所以->where('id,name')调用的是Query里有where()

第4步:

因为Query里的where()返回return $this;。所以->find('id,name')调用的是Query里有find()

撰写答案

推广链接