请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

PHP 中的 duck typing

老师,您好,我本身是做 PHP 的。所以,使用 PHP 来描述我自己在学您的课程之后得到的一点理解。你看,这样的理解,是不是正确。

public function getConfigs($configObject)
{
    return $configObeject->getConfigs();
}

这是一个获取配置的方法,其不管传入的对象是什么,只要其实现了getConfigs方法即可。这非常灵活,而且是在运行时确定的。只有运行到这行代码,才能够确定这对象是否存在这个方法,如果不存在就报错了。这和您课程中举例的 Python 的例子是一样的。

同样是 PHP, 上面的代码如果改成下面这样子,就不是 duck typing:

public function getConfigs(ConfigInterface $configObject)
{
    return $configObeject->getConfigs();
}

之所以不是鸭子类型,和您在举的 Java 例子是一样的,因为它必须实现ConfigInterface接口才可以,所以不是 duck typing。

我并不太了解 Java,不知道拿您使用 Java 的例子,套用在 PHP 上是否仍旧适用。如果您看到,还希望帮我确认一下。感谢!

正在回答

3回答

ccmouse 2019-08-22 21:00:27

同学的理解是正确的!

不过呢,在其他语言中不建议使用上面的duck typing的写法。我们宁可放弃灵活性,采用接口的写法。毕竟,强制类型检查获得的好处要比灵活性大得多。

在Go语言中由于由使用者定义接口,实现者不需要显示实现接口,才给我们带来即灵活又强制类型检查的duck typing。

1 回复 有任何疑惑可以回复我~
  • 提问者 苏近之2020 #1
    谢谢老师,另外想问一下,您接下来还会出Go语言的课吗?我很想跟着您继续把go语言学下去。
    回复 有任何疑惑可以回复我~ 2019-08-22 21:02:36
qq_安东尼_4 2021-12-11 21:29:59

php有接口类功能:

//接口类
interface a
{
    //定义接口方法
    public function getInfoById(int $id): array;
}

引用类必须创建接口类中的所有方法,否则在执行时会报错

class b implements a
{
    //实现接口方法
    public function getInfoById($id):array
    {
       //业务逻辑.....
       return [];
    }
}


0 回复 有任何疑惑可以回复我~
蹭你七时年 2021-04-23 13:37:19

道理是这样。。但是,我无法理解这样的写法应用场景在哪里?

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信