我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

链式调用Method Chaining是在php代码中一种非常常见的编码技巧,通过每个类里的每一个(其实是大多数)函数都返回$this,来完成链式调用的链接过程。

苏南大叔:php教程,如何实现类实例方法的连续链式调用? - php方法的链式调用
php教程,如何实现类实例方法的连续链式调用?(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验文章总结。测试环境:win10nginx@1.15.11php@8.2.10-nts

核心技术点

这种链式调用都是基于某个类的实例的,这种支持链式调用的类,一般都有个getResult()之类的方法,作为链式调用的终结。由它来输出一系列操作的结果,也就是说这个函数是不用返回$this的,而是返回其它的目标数据。

大多数链式调用的方法,都需要接收参数,完善内部的查询结果。同时,最重要的是:在方法的最终要返回值$this。就是说:通常意义上的method(),是要返回目标数据的。而链式调用则不是,它返回$this,会有一个get类似的方法,来获得存储在内部的处理结果。

链式调用范例

下面的代码,是实现php链式调用的最简单最常见的例子。

class Sunan
{
    protected $result;
    protected $hasError = false;
    public function a()
    {
        if (!$this->hasError) {
            // 执行正常逻辑
            $this->result = ['苏南大叔', 'newsn.net'];
        }
        return $this;
    }
    public function b()
    {
        if (!$this->hasError) {
            // 执行正常逻辑,然后报错了
            $this->hasError = (bool) mt_rand(0, 1); // 在0和1这两个状态之间,随机报错
        }
        return $this;
    }
    public function GetResult()
    {
        if ($this->hasError) {
            $this->result = ['--', '--'];
        }
        return [$this->result, $this->hasError];
    }
}
$sn = new Sunan();
list($result, $hashasError) = $sn->a()->b()->GetResult();
var_dump($result, $hashasError);

苏南大叔:php教程,如何实现类实例方法的连续链式调用? - 链式调用的关键点
php教程,如何实现类实例方法的连续链式调用?(图2-2)

输出结果:

array(2) {
  [0]=>
  string(12) "苏南大叔"
  [1]=>
  string(9) "newsn.net"
}
bool(false)

或者:


array(2) {
  [0]=>
  string(2) "--"
  [1]=>
  string(2) "--"
}
bool(true)

相关文章

结束语

链式调用看起来有些神秘,其实实现上只要注意及时的return $this即可,没有太特殊的地方。更多苏南大叔的php经验总结文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php