将子 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 class 中我想使用的一些功能,我将不得不复制粘贴该代码(反对 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;
}
}
我构建了一个包(简单地说就是这个 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 class 中我想使用的一些功能,我将不得不复制粘贴该代码(反对 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;
}
}