PHP 中的 duck typing

来源:6-2 duck typing的概念

苏近之2020

2019-08-21

老师,您好,我本身是做 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

同学的理解是正确的!

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

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

1
1
苏近之2020
谢谢老师,另外想问一下,您接下来还会出Go语言的课吗?我很想跟着您继续把go语言学下去。
2019-08-22
共1条回复

qq_安东尼_4

2021-12-11

php有接口类功能:

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

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

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


0
0

蹭你七时年

2021-04-23

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

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程