php - 为什么使用动态/松散类型语言的接口(interface)?

标签 php oop design-by-contract

我在 php 工作,接口(interface)的概念在这里对我来说似乎有点无用。通过阅读,我了解到接口(interface)是“按契约(Contract)设计”的一部分,但如果至少不保证特定类型的返回,实际上就没有任何契约(Contract)。这看起来像是一份契约(Contract),上面写着“我们同意执行以下操作:''”——没有协议(protocol)条款。

如果我想保证一个对象有一个方法,那么接口(interface)似乎并不是特别有用。如果我尝试调用一个对象没有的方法,我会得到一个 fatal error ,所以我很快发现那个类没有同名的方法。如果我想聪明一点,事先检查一个类是否有方法,然后检查接口(interface),看看对象是否实现了该接口(interface),这似乎并没有比直接检查该对象(我会这样做)节省更多时间无论如何要查看该类是否具有该方法,而不管它实现或未实现的任何接口(interface))。

换句话说,仅仅因为我有一组具有特定名称的方法,这并不能保证我有任何特定的行为。如果我保证返回某种类型的变量,我至少对输出的内容有一些了解,并且我可以编写使用具有该接口(interface)的对象的代码,因为我知道我要输出什么它的。如果它返回一个字符串,我可以继续编码,至少可以确定我之后处理的是一个字符串输出。因此,当指定返回类型时,我至少可以保证某些行为。保证行为是接口(interface)的一部分,还是不是?

我唯一能想到的是,当我编写代码时,它可以作为我自己的便利贴,以确保在以后编写该类时创建某些方法。它看起来更像是我编写代码时的脚手架;当我实际使用它时,我看不到太多好处。所以对我来说,在创建类时比在编写类时保持标准更重要。这种好处似乎并没有真正体现在契约(Contract)设计的概念中。

使用动态/松散类型语言(如 PHP)中的接口(interface),您实际上获得了哪些好处?它们很棒吗?还是更强大的 OO 语言实现了它,所以 PHP 也实现了它?

最佳答案

当您实际期望一个对象实现一个方法时,就会使用接口(interface)。

例如,如果我正在构建一个 DB 包装器并且它支持您在 Bootstrap 中注册自己的行为,那么在运行您的行为(例如,sluggable)之前,我将检查它们是否通过以下方式实现了我的“DB_Wrapper_Behaviour_Interface”使用:

if(!($behaviourObject instanceof DB_Wrapper_Behaviour_Interface)) {
    throw new Exception("Your behaviour doesn't implement my interface");
}

关于php - 为什么使用动态/松散类型语言的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3568078/

相关文章:

php - Cakephp 2 在多个部分获取数据的问题

PHP ActiveRecord - find_by_sql + 包含

.net - 在 .NET 中断言参数和值的前置条件和后置条件的最佳方法是什么?

java - 何时添加前提条件以及何时(仅)抛出异常?

javascript - Angular Js $httpParamSerializer 和 jQuery $.ajax

php - 不使用 ondelete 或 onupdate 时外键的优势

java - 比较父类型的两个子类型时正确的 API 实现

java - 如何使用字符串输入访问现有对象(将字符串输入转换为对象名称)

C++:用作逻辑值时如何返回对象的设置状态

design-by-contract - 不可空对象有什么问题?