PHP 使用魔法函数 __call 实现类似重载的功能

这几天为了面试复习了php的魔法函数看到 __call使我有了一个想法也许能够用使用这个函数实现方法重载

public function __call($name, $arguments)

这是_call的函数头,有被调用的函数名称跟参数,我的想法是根据名称然后匹配参数类型来实现重载。
经过调试我发现 :调用类部已有的方法不会去调用__call

function testFuc1(string $str)
{
    echo $str.PHP_EOL;
}

function testFuc2(int $int)
{
    echo $int.PHP_EOL;
}

定义两个测试函数 php7 当然这只是为了测试方便设置的,你也可以修改到支持到你的php版本。

class Test
{
    private $matchingArgs = [];

    public function __call($name, $arguments)
    {
        $args = $this->matchingArgs[$name];
        if (count($args) == 0) {
            return;
        }
        $argsType = [];
        foreach ($arguments as $arg) {
            array_push($argsType, gettype($arg));
        }
        foreach ($args as $math) {
            if ($math['argsType'] == $argsType) {
                return call_user_func_array($math['func'], $arguments);
            }
        }

    }

    public function addMethod($name, $args, $func)
    {
        $this->matchingArgs[$name][] = [
            'argsType' => $args,
            'func' => $func
        ];
    }
}

这就是最终的类了,必须得手动添加类,其实可以使用反射来做。但是偷懒没用

$t = new Test();
$t->addMethod('fuck', ['string'], 'testFuc1');
$t->addMethod('fuck', ['integer'], 'testFuc2');
$t->fuck('123');
$t->fuck(456);

一下是后期有空的可能会实现的功能

  • 自动添加
  • 支持类函数
  • 静态方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值