PHP 如何优(zhuang)雅(bi)的使用魔术方法__call()

我们来看一下__call()方法:

 public function __call($function_name,$arguments)
 {

 }

__call()在调用的方法不存在时会被自动调用,第一个参数function_name是被调用的方法名,第二个参数arguments是传入参数的数组。

举个栗子:

<?php
class Foo
{
    public function __call($function_name,$arguments)
    {
        var_dump($function_name,$arguments);
    }

    public function A()
    {
        echo 'hello world';
    }
}

$test = new Foo();
$data1 = 1;
$data2 = 2;
$test->B($data1,$data2);
?>

/*以上例程会输出:
string(1) "B"
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}/

到此算是理解了__call()的基本原理,接下来思考下有哪些优(zhuang)雅(bi)的用法

一、调用的方法不存在时做统一错误处理

public function __call($function_name,$arguments)
 {
    //统一处理,抛异常,写日志之类的
 }

这种用法比较简单,不做过多叙述

二、实现代码简化

假设我们要在BO(Business Object)层使用curl来调用http服务,一般的写法是:

class base
{
    public function httpCall($url,$params)
    {
        //此处假设已经有封装好的CURL类
        $result = CURL::request($url,$params);
        return $result;
    }
}

class bo extends base
{
    public function a($params)
    {
        $url = $urlA;//$urlA指a方法的url,下同
        return $this->httpCall($url,$params);
    }

    public function b($params)
    {
        $url = $urlB;
        return $this->httpCall($url,$params); 
    }

    public function c($params)
    {
        $url = $urlC;
        return $this->httpCall($url,$params);
    }

    public function d($params)
    {
        $url = $urlD;
        return $this->httpCall($url,$params);
    }
    .
    .
    .

}

这样的写法,在bo类里面只实现传参的功能,代码却非常的冗长

使用__call的简化版

class base
{
    public function __call($name,$arguments)
    {
        $className = get_class($this);
        $url = $className::$urls[$name];
        $params = $arguments[0];
        $result = $this->httpCall($url, $params));
        return $result;
    }

    public function httpCall($url,$params)
    {
        $result = CURL::request($url,$params);
        return $result;
    }
}

class bo extends base
{
    public static $urls = [
        'a' => $urlA,//指a方法的url,下同
        'b' => $urlB,
        'c' => $urlC,
        'd' => $urlD,
        .
        .
        .
    ];
}

可以看到bo类里的代码瞬间就变得非常简洁,就和写配置文件一样。

总结
大部分情况下工程会有很多业务模块,每个业务模块都会有自己的bo类,合理使用__call()方法可以简化很多冗余的代码,提高开发效率,增加可读性,balabala…这都不重要,重要的是用起来非常的优(zhuang)雅(bi)。大家还有别的什么好玩的用法欢迎互相讨论学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值