如何在PHP中为静态类函数设置别名

时间:2014-05-01 20:45:51

标签: php class static alias

PHP中,我有一个带静态方法的类:

class Foo {
   public static function bar($arg1, $arg2, $arg3) {
        //logic here
   }
}

我想创建一个名为star()的静态方法的别名,以便向后兼容。它被称为相同的方式:

 Foo::star('a', 'b', 'c');

最好的方法是什么?如果我可以更改参数数量或bar()这个更改的顺序自动传播到star(),我更喜欢。

2 个答案:

答案 0 :(得分:5)

public static function star()
{
    return call_user_func_array(array('Foo', 'bar'), func_get_args());
}

参考文献:

答案 1 :(得分:1)

您的问题的简短(和有趣!)答案是将您的函数存储在trait中,然后在导入特征时将该函数设为别名。这将确保两个函数具有相同的方法签名。

// Tested on PHP 5.4.16
trait BarTrait
{
    public static function bar($arg1, $arg2, $arg3) {
        echo $arg1, $arg2, $arg3, "\n";
    }
}

class TestClass
{
    use BarTrait { bar as star; }
}
TestClass::bar(1, 2, 3);
TestClass::star(1, 2, 3);

答案很长,我不认为您需要更改star()方法的功能签名。

如果您保留star()方法,那是因为您要么拥有一个不想破解的API,要么在短期内有太多的呼叫站点需要修复。

在这两种情况下,安全地向star()方法添加更多参数的唯一方法是使用可选参数,即star($arg1, $arg2, $arg3, $arg4 = null, $arg5 = null)这意味着bar()需要具有可选功能参数也是如此。

如果bar()有可选参数,则无需再更改star()的方法签名。

您只需使用非可选参数star()呼叫bar()

class Foo {
    public static function bar($arg1, $arg2, $arg3, $arg4 = null, $arg5 = null) {
        //logic here
    }
    public static function star($arg1, $arg2, $arg3) {
        return static::bar($arg1, $arg2, $arg3);
    }
}

您要修改以使用新参数的任何star()调用都可以轻松修改,以便调用far()

如果您确实需要更改star()的签名,我会有兴趣了解更多信息。

-D