PHP链式操作

众位看官是不是很羡慕js的那种链式操作,比如这种:document.getElementById()这种骚操作,是不是看到PHP框架中那种ORM 的链式操作很羡慕,不怕,带你走进这种骚操作的大门,这都不是事,来吧,骚年!

学了PHP相比有个东东大家已经知道了------魔术方法。什么不知道????好吧,你PHP还是个小白呢,朋友。

现在用魔术方法中的两个家伙来给大家实现,链式操作: ``` _ _construct() , _ _call() 。

来个示范吧:" abc fdff ds " 对于这个字符串,如果我想去掉前后空格,然后用中间的空格分割变成数组,最后获得数组长度,简而言之3个PHP函数搞定:trim(),explode(),count(),如果链式操作呢,像这种$str->trim()->explode()->cunt(),应该玩呢??

方式ONE:
先构造个类吧

private $value;   //在来个成员属性吧,然后操作他
class StrHelper{
    //在来个构造方法
 public function __construct($value)
    {
        $this->value = $value;
    }

// 再来个魔术方法 __call(),该方法目的是,当函数没有你调用的方法是会走到这里,静态方法除外,静态方法谷歌会告诉你
 public function __call($func, $arguments)
    {
        // TODO: Implement __call() method.
      $this->value = call_user_func($func, $this->value);
       return $this;
    }

//开始你的链式3联机
 public function explode(){
        $this->value = explode(' ', $this->value);
        return $this;

    }
    public function count(){
        $this->value = count( $this->value);
        return $this;
    }

 public function toArray(){
        return $this->value;
    }
}
//看下使用结果
$str = new StrHelper('  abc  fdff  ds ');
$a = $str->trim()->explode()->count();
//结果是一个obj,原因是```__call()```返回是this,对象
//怎么解决呢??
//在写个方法就行了,看方法toArray()
$a = $str->trim()->explode()->count()->toArray();//这样就行了

总结:链式操作的重点便是,每个函数返回必须是this,否则是不行的.当然吧call_user_func 换成call_user_func_array也是可以的。
第二种:

class StringHelper1
{
    private $value;
    protected $data;

    public function __construct($value)
    {
        $this->value = $value;
    }
    public function trim()
    {
        $this->value = rtrim($this->value);
        return $this;
    }

    public function strlen()
    {
        $this->value = strlen($this->value);
        return $this;
    }

    public function finish(){
        return  $this->value;
    }

    public function __call($name, $arguments)
    {
        // TODO: Implement __call() method.
        echo 'method '.$name.' not exit'.PHP_EOL;die;
    }
}
$str = new StringHelper1("  sd f  0");
var_dump( $str->trim()->strlen()->finish());

你可能感兴趣的:(PHP链式操作)