【问题标题】:PHP type hinting and inheritancePHP 类型提示和继承
【发布时间】:2018-08-24 14:42:14
【问题描述】:

我有一堆数据库模型,它们都扩展了一个名为 myDBModel 的基类,类似于:

class myPostgresModel extends myDBModel 

我正在构建一组与这些模型交互的类,它们都扩展了另一个名为 MyBaseParser 的基类。这些解析器类需要将 DB 模型作为参数,但它可以是任何可用模型。所以我把它定义为

class myBaseParser implements ParserInterface
{
    public function doSomething(myDBModel $model){}
}

interface ParserInterface
{
    public function doSomething(myDBModel $model);
}

然后

class myPostgresParser
{ 
    public function doSomething(myPostgresModel $model) {}

如果我创建一个 postgres 解析器,并将 myPostgresModel 传递给 doSomething 方法,我会收到一个错误,因为它需要 myDBModelmyPostgresModel 不应该被接受,因为它是 myDBModel 类的孩子吗?处理这种继承的正确方法是什么?

【问题讨论】:

  • 能否提供一个实际的复制案例?这应该可以在 3v4l.org 之类的网站中复制

标签: php class inheritance


【解决方案1】:

您共享的代码不应引发任何错误,可能是因为您忘记让myPostgresParser 继承一些myBaseParser 或实现ParserInterface。我猜你想要这个:

class myPostgresParser extends myBaseParser {}
//                     ^^^^^^^^^^^^^^^^^^^^

在任何情况下都存在潜在的设计问题。您想假装 myPostgresParser 实现 ParserInterface::doSomething() 但实际上实现了具有相同名称但(略有)不同参数的不同方法。 PHP 应该通过如下消息发出警告:

致命错误:myPostgresParser::doSomething(myPostgresModel $model) 的声明必须与 ParserInterface::doSomething(myDBModel $model) 兼容

(如果您看不到错误消息,请确保您已将开发环境配置为显示它们。)

错误信息当然是正确的:如果myPostgresParser::doSomething() 不能使用继承自myDBModel 的任何类来完成这项工作,那么它不符合接口,在第一名。

我建议你回到设计表并决定myDBModel 在这里扮演什么角色。模型应该具有跨引擎的一些规范化行为,第三方类可以依赖这些行为。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多