【问题标题】:How to alias a static class function in PHP如何在 PHP 中为静态类函数起别名
【发布时间】:2014-05-01 20:45:51
【问题描述】:

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

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

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

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

最好的方法是什么?如果我可以更改bar() 的参数数量或顺序,我更愿意,此更改也会自动传播到star()。

【问题讨论】:

  • func_get_args() + call_user_func_array()

标签: php class static alias


【解决方案1】:
public static function star()
{
    return call_user_func_array(array('Foo', 'bar'), func_get_args());
}

参考资料:

【讨论】:

    【解决方案2】:

    对您的问题的简短(且有趣!)答案是将您的函数存储在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      相关资源
      最近更新 更多