平常调用函数:
strlen(trim('011010','0'))
链式操作:
$str->trim('0')->strlen()
代码变优雅了,简单易懂,其实原理很简单。通过魔术方法__call来实现
class case1{
public $value;
public function __construct($str = NULL)
{
$this->value = $str;
}
public function __call($name, $args){
$this->value = call_user_func($name,$this->value,$args[0]);
return $this;
}
public function strlen(){
return strlen($this->value);
}
}
$str = new case1('0110100');
echo '</br>'.$str->value;//输出0110100
echo '</br>'.$str->trim('0')->strlen();//输出4
echo '</br>'.strlen(trim('0110100','0'));//输出4
这样就实现了一个简单的链式操作。
链式操作的连续调用 最终值取决于 最后调用的那个方法,则最后一个方法 只能返回值 不能是对象就是$this 前面的方法共同点都是处理之后返回自身$this 所以就要在类或基类里申明变量。然后之前的方法对这些变量进行处理赋值 最后通过最后一个方法 返回一个值
也可以不用魔术方法,就是直接申明你需要的那个方法
class case1{
public $value;
public function __construct($str = NULL)
{
$this->value = $str;
}
// public function __call($name, $args){
// $this->value = call_user_func($name,$this->value,$args[0]);
// return $this;
// }
public function trim($val){
$this->value = trim($this->value,$val);
return $this;
}
public function strlen(){
return strlen($this->value);
}
}
$str = new case1('0110100');
echo '</br>'.$str->value;
echo '</br>'.$str->trim('0')->strlen();
echo '</br>'.strlen(trim('0110100','0'));
输出同样的结果