在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是: strlen(trim($str)) 如果要实现类似js中的链式操作,比如像下面这样应该怎么写? $str->trim()->strlen() 下面分别用三种方式来实现: 方法一、使用魔法函数__call结合call_user_func来实现 思想:首先定义一个字符串类StringHelper,构造函数直接赋值value,然后链式调用trim()和strlen()函数,通过在调用的魔法函数__call()中使用call_user_func来处理调用关系,实现如下: <?php class String 在PHP编程中,链式操作是一种常见的编程技巧,它允许我们连续调用对象的方法而无需在每次调用后创建新的对象。这样的语法风格使得代码更加简洁、易读。本文将详细解析三种不同的方法来实现PHP中的链式操作,特别是在处理字符串操作时。 ### 方法一:使用魔法函数`__call`结合`call_user_func` 这种方法的关键在于定义一个`StringHelper`类,该类具有一个`__call`方法,当尝试调用未定义的方法时,`__call`会被触发。在这个例子中,我们使用`call_user_func`函数来动态地执行传入的方法,并将当前对象的值作为参数传递。下面是如何实现的: ```php class StringHelper { private $value; function __construct($value) { $this->value = $value; } function __call($function, $args) { $this->value = call_user_func($function, $this->value, $args[0]); return $this; } function strlen() { return strlen($this->value); } } $str = new StringHelper(" sd f 0"); echo $str->trim('0')->strlen(); ``` ### 方法二:使用魔法函数`__call`结合`call_user_func_array` 与方法一类似,这里同样使用`__call`,但这次我们使用`call_user_func_array`函数来处理动态调用。`call_user_func_array`允许我们传递一个数组作为参数,它会自动解包数组并将其作为单独的参数传递给目标函数。为了适应这个,我们需要先使用`array_unshift`将当前对象的值添加到参数数组的开头。 ```php class StringHelper { private $value; function __construct($value) { $this->value = $value; } function __call($function, $args) { array_unshift($args, $this->value); $this->value = call_user_func_array($function, $args); return $this; } function strlen() { return strlen($this->value); } } $str = new StringHelper(" sd f 0"); echo $str->trim('0')->strlen(); ``` ### 方法三:不使用魔法函数`__call` 这种方法更直接,我们为每个想要实现的链式操作的方法(如`trim`)编写具体的方法。这些方法内部处理操作并将`$this`对象返回,以便可以继续链式调用。 ```php class StringHelper { private $value; function __construct($value) { $this->value = $value; } public function trim($t) { $this->value = trim($this->value, $t); return $this; } function strlen() { return strlen($this->value); } } $str = new StringHelper(" sd f 0"); echo $str->trim('0')->strlen(); ``` 总结起来,这三种方法都实现了PHP中的链式操作,允许我们像JavaScript那样优雅地处理字符串操作。`__call`和`call_user_func`或`call_user_func_array`提供了更大的灵活性,可以应对更多动态调用的情况,而第三种方法则更为简洁,适用于已知的操作。根据实际需求和项目规模,开发者可以选择最适合的实现方式。
- 粉丝: 3
- 资源: 923
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助