将子类(原始的类函数arg)作为arg传递给重写函数

时间:2018-03-08 10:41:06

标签: php-7.1

我已经构建了一个包(简称为这篇文章)包含一个User模型类和一个UserFormatter类。我有一个应用程序加载此包以添加一些自定义工作。

我喜欢在自定义应用程序中执行的操作是让UserFormatter在其数组中返回一个附加键。

让我首先展示一些代码,以了解我的问题':

包裹代码:

class User
{
    protected $id;
    protected $name;
    protected $email;
}

class UserFormatter
{
    public static function format(User $user)
    {
        return [
            'email' => $user->email,
        ];
    }
}

应用程序代码(用于覆盖某些包代码):

class UserExt extends User
{
    protected $role;
}

class UserFormatterExt extends UserFormatter
{
    public static function format(UserExt $user)
    {
        return [
            'email' => $user->email,
            'role'  => $user->role,
        ];
    }
}

这不符合我的想法。 PHP警告我重写格式函数中的arg。 typehint不匹配(User<> UserExt)尽管UserExt是User的子类。

我想知道什么是解决我问题的最佳解决方案?

我想到了一些不同的选择:

  • 不要扩展UserFormatter,但是我在UserFormatter类中丢失了一些我想要使用的功能,我将不得不复制粘贴该代码(针对DRY)
  • 删除格式化函数的arg的typehint,并检查传入的arg是否为实例...
  • 还是有更好的解决方案

由于

1 个答案:

答案 0 :(得分:0)

不要扩展UserFormatter,而是在自定义UserFormatter中调用UserFormatter::format,然后将其他数据合并到返回的数组中。

class UserFormatterExt
{
    public static function format(UserExt $user)
    {
        $formattedUser = UserFormatter::format($user);
        $formattedUser['role'] = $user->role;
        return $formattedUser;
    }
}