1. 杨乐多博客首页
  2. 技术杂谈
  3. PHP

PHP实现链式操作或连贯操作的方法

比如要实现过滤字符串首尾的空格或指定字符,再求出字符串的长度,一般会这么写:strlen(trim($aspyc));
暂且以这个为例,采用链式操作来实现相同效果。
链式操作,其实就是链式的调用对象的方法。这里既然要实现对字符串的链式操作,那么就要实现一个字符串类,然后对这个类的对象进行调用操作。
对字符串类的处理逻辑应该有:
1. 当创建对象时,可以将字符串赋值给对象的属性,并且可以访问这个属性读取值;
2. 可以调用trim()和strlen()方法;
3. 还可以这么调用方法 $aspyc->trim()->strlen()。
实现步骤如下:第一步

//代码实现
<?php
class AspStrings
{
    public $aspyc;

    public function __construct($aspyc=null)
    {
        $this->aspyc = $aspyc;
    }
}
//运行代码
$asp = new AspStrings('123456');
echo $asp->aspyc;
//运行结果
123456

第二步,先把$asp->trim()实现了,参考《魔术方法__call》,触发__call方法后再执行call_user_func

//代码实现
<?php
class AspStrings
{
    public $aspyc;

    public function __construct($aspyc=null)
    {
        $this->aspyc = $aspyc;
    }

    public function __call($name, $args)
    {
        $this->aspyc = call_user_func($name, $this->aspyc, $args[0]);
        return $this;  //这里很关键,做个标识Y
    }
}
//运行代码
$asp = new AspStrings('123456');
echo $asp->trim('1')->aspyc;
//运行结果
23456

$this->aspyc = call_user_func($name, $this->value, $args[0]); 其中$name是回调函数的名字(这里也就是trim),后面两个是回调函数(trim)的参数,参数的顺序不要弄颠倒了。$args是数组,也需要注意。
第二步中还要实现strlen(),这时上面代码中的【标识Y】就很关键了:return $this; 它的作用就是,在它前面刚刚调用trim()处理完字符串后重新给aspyc属性赋值,然后返回当前对象的引用,这样对象内的其他方法就可以对属性aspyc进行连续操作了,也就实现了链式操作。
第三步,实现 $asp->strlen()

//代码实现
<?php
class AspStrings
{
    public $aspyc;

    public function __construct($aspyc=null)
    {
        $this->aspyc = $aspyc;
    }

    public function __call($name, $args)
    {
        $this->aspyc = call_user_func($name, $this->aspyc, $args[0]);
        return $this;  //这里很关键,做个标识Y
    }

    public function strlen()
    {
        return strlen($this->aspyc);
    }
}
//运行代码
$asp = new AspStrings('123456');
echo $asp->strlen();
//运行结果
6

最终链式操作写法已完成:

//运行代码
$asp = new AspStrings('123456');
echo $asp->trim('1')->strlen();
//运行结果
5

到此,一个简单的链式操作示例已完成。其实不用__call()方法,也可以实现链式操作。下面是不用__call()的实现代码

//代码实现
<?php
class AspStrings
{
    public $aspyc;

    public function __construct($aspyc=null)
    {
        $this->aspyc = $aspyc;
    }

    //public function __call($name, $args)
    //{
        //$this->aspyc = call_user_func($name, $this->aspyc, $args[0]);
        //return $this;
    //}

    public function trim($yc)
    {
        $this->aspyc = trim($this->aspyc, $yc);
        return $this;
    }

    public function strlen()
    {
        return strlen($this->aspyc);
    }
}
//运行代码
$asp = new AspStrings('123456');
echo $asp->trim('1')->strlen();
//运行结果
5

链式操作的关键是在做完操作后要 return $this
用call_user_func_array()替换了call_user_func()实现,将__call()方法修改如下

//代码实现
<?php
class AspStrings
{
    public $aspyc;

    public function __construct($aspyc=null)
    {
        $this->aspyc = $aspyc;
    }

    public function __call($name, $args)
    {
        array_unshift($args, $this->aspyc);
        $this->aspyc = call_user_func_array($name, $args);
        //$this->aspyc = call_user_func($name, $this->aspyc, $args[0]);
        return $this;
    }

    //public function trim($t)
    //{
        //$this->aspyc = trim($this->aspyc, $t);
       //return $this;
    //}

    public function strlen()
    {
        return strlen($this->aspyc);
    }
}
//运行代码
$asp = new AspStrings('123456');
echo $asp->trim('1')->strlen();
//运行结果
5

至此,PHP实现链式操作的方法全部介绍完毕,可能还有更多实现方式…

原创文章,作者:iConan,如若转载,请注明出处:https://www.aspyc.com/archives/613.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

评论列表(2条)

  • 匿名
    匿名 28/02/2018 下午3:54

    内容很好,可以很好理解PHP框架中的连贯操作了