7

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

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

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

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

在 PHP 等动态/松散类型语言中使用接口实际上能获得什么好处?它们很棒,还是它是更强大的面向对象语言实现的东西,所以 PHP 也实现了它?

4

4 回答 4

3

当您实际期望对象实现方法时使用接口。

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

if(!($behaviourObject instanceof DB_Wrapper_Behaviour_Interface)) {
    throw new Exception("Your behaviour doesn't implement my interface");
}
于 2010-08-25T16:28:59.900 回答
1

如果没有返回类型,合同设计会变得更加困难,但不要忘记支持“告诉”而不是“询问”。

我相信接口就像一种责任。你正在编码,需要一个合作者。您要求它做某事,因为您正在处理的代码不能做所有事情。所以你要求另一个对象做某事。界面保证协作者将完成工作,但隐藏了“如何”完成的部分。

现在你可以争辩说这里不需要正式的合同,因为如果合作者不能做你要求它做的事情,系统无论如何都会抛出一个错误。但我认为这忽略了使用接口作为一种责任。

于 2010-08-25T18:19:17.640 回答
0

出现致命错误并不总是“容易”的。有时您必须执行特定的模块/操作才能看到您的课程中确实缺少某些东西。该接口使您能够确保实现每个方法并记录这些方法(参数究竟是什么,返回值应该是什么样子)。如果参数/值是具有特定结构的数组并且您不想使用类来代替(为了简单起见),这很有用。

于 2010-08-25T16:36:32.053 回答
0

我想指出,PHP 5.4 将支持类型提示。现在我认为只有函数参数的类型提示,但我想也会有返回值。(至少已经有一个RFC,虽然是一个非常古老和过时的。)

于 2010-08-25T16:45:05.670 回答