这几天为了面试复习了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);
一下是后期有空的可能会实现的功能
- 自动添加
- 支持类函数
- 静态方法