PHP使用call_user_func函数和__call()实现对象的链式操作

162 阅读1分钟
  • 需求示例:

        现在要将对一个字符串的操作 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()