将子类(原始类函数 arg)作为 arg 传递给被覆盖的函数



我构建了一个包(简单地说在这篇文章中)包含一个用户模型类和一个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 的信息。类型提示不匹配(User <> UserExt),尽管UserExt是User的子类。

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

我想到的一些不同选择:

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

谢谢

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

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

最新更新