用过tp的朋友们一定知道他封装的连贯操作,这里简单介绍一下如何实现 无顺序的连贯调用。以及他的原理。(大神略过....)
首先说下两个要点,
一、无顺序
既然是无顺序,那就意味着可以先调用任何一个方法,如何实现呢 ,答案很简单那就是保证每个方法都返回 $this(也就是当前被实例化的对象)。
二调用php函数
这里有两个知识点
①__call(不知道的可以去看手册啊,手册上讲的很清楚)。
②call_user_func_array();还有一个call_user_func()不过没有call_user_func_array()牛逼。
在连贯操作中如果你调用一个未定义的方法,毫无疑问肯定会报错。这个时候就要用到__call,然后使用call_user_func_array去调用php函数。
③多讲一嘴 mergeStr中 有用到一个func_get_args,当函数的参数不确定的时候该函数灰常有用,一定要mark呦
下面举一个小小的例子,以供参考.
class Str { public $value; public function __construct($str=null) { $this->value = $str; } //合并随机数 public function mergeRand() { $rand = mt_rand(10000, 99999); $this->value .= $rand; return $this; } //合并自定义子串 public function mergeStr() { $arr = func_get_args(); if($arr) { foreach ($arr as $ar) { $this->value .= $ar; } } return $this; } //添加时间戳 public function addUnix() { $this->value .= ‘_‘ . time(); return $this; } /* public function __call($name, $args) { $this->value = call_user_func($name, $this->value, $args[0]); return $this; }*/ public function __call($name, $args) { array_unshift($args, $this->value); $this->value = call_user_func_array($name, $args); return $this; } } $str = new Str(‘,aaaabbbb,‘); echo $str->trim(‘,‘)->mergeStr(‘CC‘,‘DD‘)->addUnix()->mergeRand()->md5()->value; die;