- 需求示例:
现在要将对一个字符串的操作 strlen(trim($str)) 改为 $str->trim()->strlen() 这样的链式操作。
- 代码示例:
封装一个字符串类StringHelper,通过构造函数给str赋值,通过魔法方法__call()链式调用trim()和strlen()函数
class StringHelper{
public $value;
public function __construct($str)
{
$this->value = $str;
}
public function __call($name, $arguments)
{
$this->value = call_user_func($name,$this->value);
return $this;
}
}
//调用示例
$str = new StringHelper(' hello ');
$result = $str->trim()->strlen();
echo $result->value; //5
//代码说明
//$str->trim(),由于StringHelper类没有trim方法,这时候调用_call魔术方法
//__call($name, $arguments)中$name的值是trim
//call_user_func的第一个参数值为调用的方法名trim,第二个参数就是$this->value
//$str->strlen() 执行流程同$str->trim()