php如何定义类似如下静态调用,并且通过箭头多级关联调用的类和函数
Db::name('name')->field('id,name')->where('id',1)->find()
php如何定义类似如下静态调用,并且通过箭头多级关联调用的类和函数
Db::name('name')->field('id,name')->where('id',1)->find()
2 回答1.3k 阅读✓ 已解决
2 回答3.1k 阅读
1 回答956 阅读✓ 已解决
2 回答839 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
2 回答895 阅读
1 回答883 阅读
鉴于楼主知识点薄弱,详细回答下:
第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()
,所以实际调用的父类Connection
的name()
(知识点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()
。