如何在 PHP 中为类方法取别名?

Jam*_*ong 5 php class

假设我在 PHP 中有一个类,它有一个序列化数据的方法。作为英语,我使用-ISE的英语拼写。

class Foo
{

    public function serialise($data)
    {
        return json_encode($data);
    }

}
Run Code Online (Sandbox Code Playgroud)

假设我的团队中有一位美国开发人员试图“序列化”数据(-IZE)。

$foo = new Foo();
$foo->serialize(['one', 'two', 'three']);
// PHP Fatal error: Uncaught Error: Call to undefined method Foo::serialize()
Run Code Online (Sandbox Code Playgroud)

解决这个问题的显而易见的方法是给方法添加别名。我的直觉是用美式拼写创建另一种方法并简单地传递相同的参数。

class Foo
{

    // ...

    public function serialize($data)
    {
        return $this->serialise($data);
    }

}
Run Code Online (Sandbox Code Playgroud)

但这有几个缺点:

  • 我必须匹配参数并记住在有更新时更新这两种方法(容易出错)。
  • 美国开发人员的额外功能调用意味着代码效率较低。
  • 修改子类中的一个并不一定会更新另一个。

我的问题是:有没有更好的方法来为 PHP 中的类方法设置别名?一种可以解决我所担心的问题的方法?

sno*_*ski 1

这可以使用接口和特征来实现,如下所示:

SerializeInterface.php(PHP 已使用名称“Serializable”,因此我在这里为接口使用非常规名称。):

interface SerializeInterface
{
    public function serialize($data);
}
Run Code Online (Sandbox Code Playgroud)

SerializeableTrait.php:

require_once('SerializeInterface.php');
trait SerializableTrait
{
    public function serialize($data)
    {
        return json_encode($data);
    }
}
Run Code Online (Sandbox Code Playgroud)

Foo.php

require_once('SerializeInterface.php');
require_once('SerializableTrait.php');
class Foo implements SerializeInterface
{
    use SerializableTrait;
    use SerializableTrait {
        SerializableTrait::serialize as serialise;
    }
}

$foo = new Foo();
print $foo->serialize(['one', 'two', 'three']).PHP_EOL;
print $foo->serialise(['four', 'five', 'six']).PHP_EOL;
Run Code Online (Sandbox Code Playgroud)

Foo.php 的输出:

["one","two","three"]
["four","five","six"]
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 根据您的偏好,您可能需要切换该词的“s”或“z”版本是在接口和特征中使用还是作为类中的别名。您可能希望将更常用的拼写作为界面和特征中的名称。
  • 这并不完全是万无一失的。没有任何合同可以确保 Foo.php 中使用的别名是必需的。因此,开发人员必须记住在每个实现该接口的类中添加别名。
  • 正如其他人所说,仅仅依赖标准命名约定可能比这样做更好。

如上所述,这确实允许使用两种拼写,并且允许仅在一个位置(在 SerializedTrait.php 中)更新该函数。它还具有额外的好处(相对于 IMSoP 使用“...$args”的答案),这仍然允许在大多数编辑器中完成代码。