如何在PHP中对静态类函数进行别名


How to alias a static class function in PHP

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

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

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

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

最好的方法是什么?我更希望我可以更改参数的数量或bar()的顺序,这种更改也会自动传播到star()

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

参考文献:

  • http://php.net/call_user_func_array
  • http://php.net/func_get_args

问题的简短(有趣!(答案是将函数存储在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()具有可选的parm,那么同样不需要改变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