我构建了一个包(简单地说在这篇文章中)包含一个用户模型类和一个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;
}
}