四时宝库

程序员的知识宝库

php7魔术方法__call的最佳实战之链式操作实现

目录

  • 概述
  • php对象链式操作问题描述
  • call_user_func函数详解
  • 基于__call魔术方法php对象链式操作代码实现
  • php7进阶到架构师相关阅读

概述

这是关于php进阶到架构之php7核心技术与最佳实战学习的第篇文章:php7魔术方法__call的最佳实战之链式操作实战

php对象链式操作问题描述:

strlen(trim($str)),如果要实现类似js中的链式操作,

比如像下面这样应该怎么实现?

$str->trim()->strlen()

call_user_func函数详解

call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed

call_user_func 函数类似于一种特别的调用函数的方法,

第一个参数callback是被调用的回调函数,

其余参数是回调函数的参数

使用方法如下:

function sum($a,$b){
    return $a + $b;
}
//第一个参数sum是调用的方法名
//第2个参数7和第三个参数8是sum方法调用的参数
$result = call_user_func('sum',7,8);
echo $result;//输出结果15

基于魔术方法__call实现php对象链式操作

如何通过类的魔术方法__call实现$str->trim()->strlen()的链式操作呢?

实现思路:

首先定义一个字符串类StringHelper,构造函数直接赋值value,

然后链式调用trim()和strlen()函数,

通过在调用的魔法函数__call()中使用

代码实现如下:

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();
 //1.$str->trim(),由于StringHelper类没有trim方法,这时候调用__call魔术方法
 //2.__call($name, $arguments)中$name的值是trim
 //3.call_user_func的第一个参数值为调用的方法名trim,第二个参数就是$this->value
//$str->strlen()执行流程同$str->trim()
 echo $result->value;

运行结果

5

php7进阶到架构师相关阅读

https://www.kancloud.cn/gofor/gofor

最后,欢迎大家留言补充,讨论~~~

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接