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