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

Passing child class (of the original's class function arg) as arg to overridden function

我构建了一个包(简单地说就是这个 post)包含一个用户模型 class 和一个 UserFormatter class。我有一个应用程序加载此包以添加一些自定义工作。

我喜欢在自定义应用程序中做的是让 UserFormatter return 在其数组中添加一个附加键。

让我先展示一些代码来理解我的 'issue':

包裹代码:

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。类型提示不匹配 (User <> UserExt) 尽管 UserExt 是 User 的子 class。

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

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

谢谢

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

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