首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将子类(原类函数arg)作为arg传递给重写函数

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

Stack Overflow用户
提问于 2018-03-08 10:41:05
回答 1查看 24关注 0票数 0

我已经构建了一个包,它包含一个用户模型类和一个UserFormatter类。我有一个应用程序加载这个包,以添加一些自定义工作。

在我的自定义应用程序中,我喜欢做的是让UserFormatter在它的数组中返回一个额外的键。

让我首先展示一些代码来理解我的“问题”:

包码:

代码语言:javascript
复制
class User
{
    protected $id;
    protected $name;
    protected $email;
}

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

应用程序代码(用于重写某些包代码):

代码语言:javascript
复制
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。类型提示不匹配(用户<> UserExt),尽管UserExt是用户的子类。

我想知道什么是解决我的问题的最好办法?

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

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-08 10:46:16

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

代码语言:javascript
复制
class UserFormatterExt
{
    public static function format(UserExt $user)
    {
        $formattedUser = UserFormatter::format($user);
        $formattedUser['role'] = $user->role;
        return $formattedUser;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49171111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档