众所周知,PHP 作为一门弱类型的语言,是无法直接实现像 C++,Java 那样的函数重载的。然而在某些情况下,这就非常蛋疼了。不过我们可以用一些奇技淫巧来实现「伪函数重载」。

一、使用 func_get_args() 函数

func_get_args() 函数可以获取函数参数列表的数组,我们就可以利用一下这个特性啦。

<?php

class Shit
{
    /**
     * Function reload
     */
    public static function fuck()
    {
        $args = func_get_args();
        if (count($args) == 1) {
            self::fuckMultiple($args[0]);
        } elseif(count($args) == 2) {
            self::fuckSingle($args[0], $args[1]);
        }
    }

    private static function fuckMultiple(Array $humans)
    {
        foreach ($humans as $human) {
            self::fuckSingle($human['name'], $human['sex']);
        }
    }

    private static function fuckSingle($name, $sex)
    {
        if (is_string($name) && is_bool($sex))
            echo ($sex ? "$name, boy♂next♂door" : "$name, my little baby~")."<br />";
        else
            echo "Invalid parameters.";
    }
}

echo Shit::fuck(Array(
   ['name' => 'sabi', 'sex' => true],
   ['name' => 'maki', 'sex' => false]
));

echo Shit::fuck('jack', true);

二、使用魔术方法

当访问对象中一个不存在的方法时就会调用 __call() 方法,静态调用不存在的方法时则会调用 __callStatic() 方法。我们也可以利用这两个魔术方法来实现函数重载。

具体的例子在 PHP Manual 上就有了,我就不多赘述了。