解释PHP接口

解释PHP接口,php,data-structures,Php,Data Structures,你能帮我澄清一下PHP接口吗。我知道主要的一点是,多个类可以实现一些相同的函数 abstract class Plane { public function openDoors(); } interface Fliers { public function fly(); } 现在让我们使用它们 class Boeing747 extends Plane implements Fliers { public function fly() { // some

你能帮我澄清一下PHP接口吗。我知道主要的一点是,多个类可以实现一些相同的函数

abstract class Plane {
     public function openDoors();
}


interface Fliers {
     public function fly();
}
现在让我们使用它们

class Boeing747 extends Plane implements Fliers {
  public function fly() {
     // some stuff
  }

  public function openDoors() {
    // do something
  }

}

在这种情况下,Boeing747和Tweety都可以实现接口传单来访问公共函数fly()。然而,在我看到的所有示例中,接口中实际上没有定义任何功能,而是在类方法本身内部调用时定义的

为什么我不在Boeing747和Tweety中单独定义fly()函数,而不使用接口?你能提供一个具体的,基本的例子,它将是有利的?谢谢

这是一种称为。本质上,接口是一种契约,或者是一种承诺,即实现接口的任何类都将表现出一组特定的行为。它允许您的代码检查传递给它的对象的功能,而不必担心在当前上下文中无关紧要的细节。例如,openDoors()方法同样适用于房屋、飞机、运河船闸、汽车或其他有门的东西,但除了有门之外,所有这些东西几乎没有共同之处。即使他们都支持可以打开门的想法,但实际上他们可能会以完全不同的方式执行开门操作

该接口允许您告诉调用代码,所有这些东西都有可以打开的门,而不必在它们之间强加任何人工关系(如果不存在)。instanceof关键字允许您检查对象是否满足某些条件(如果它是特定类或子类的实例,或者它是否实现了特定接口)

理论上,您可以使用其他PHP功能(如method_exists或Reflection)实现相同的功能,但这些技术远远不够理想,因为没有强制执行任何内容的合同(两个不同的类可以实现开门,但实现开门的方法的名称完全不同,您必须使用方法调用检查这两个类)。然后,假设其他程序员向系统中添加了一个新类,该类以与您已检查的完全不同的方式实现开门。在整个程序中可以开门的所有代码也必须更新以说明此新方法!如果您向系统中添加了一个新类并实现然而,ThingWithDoors接口,那么打开doors的所有代码将自动与新类一起工作,就像它与旧类一起工作一样,而不进行任何修改(前提是新类正确地实现了接口,并且尊重PHP接口没有强制执行的返回值)


对于程序员来说,这一点的另一个好处是,他们不必一直在文档/源代码中查找如何调用对象中的某些行为。如果他们知道ThingWithDoors接口是什么样子,那么他们就知道实现ThingWithDoors的所有东西都可以打开它的门,并且方法调用f或者,openDoors()总是这样做的。这可以为开发人员节省大量时间,尤其是在大型项目上!

在OO PHP中,对象只能有一个父类。要了解为什么采用这种方法,让我们使用Bird类来说明多重继承是什么,以及它如何导致问题

如果您想创建一个Wooping\u Crane类,从Bird类派生该类是有意义的。假设您还有一个濒危物种类

多重继承允许您从这两个类(鸟类类和濒危类)的组合中创建一个Wooping_Crane类。这似乎是一个很好的主意,直到您意识到这两个类都定义了一种进食行为。您更喜欢哪一个?所以这是多重继承的缺点

PHP通过两种方式解决这个问题:首先,使用接口——一个只包含函数定义的类

如果濒危物种是一个接口而不是一个类,那么拥有多个进食函数并不重要。Bird类中的方法定义将充当接口函数的实现。这样,接口就避免了两次定义同一函数的问题


第二,使用traits。你可以在其他帖子中读到它。

接口将类的工作与它的工作方式分开。就像合同一样,它定义了客户可以期望的内容,但开发人员可以根据自己的需要实现它。因此,我们可以对同一合同进行多个实现,并且你可以始终使用该接口不知道是如何实现的。所以这两个子类都是平面类,可以使用多态性对同一个func调用执行不同的操作?我知道这已经两年了,但我最近遇到了
接口
。我的问题是,如果你创建了一个对象,为什么你需要检查它内部是否有特定的方法或属性?当然,你会知道我t在那里或者可以检查。哪里需要集成接口?就像我说的,接口本质上是一个契约,一个通过统一API提供特定功能的承诺。这一点的有用性不能低估。首先是在测试中。例如,如果你有一个实现接口的数据库类,那么你可以可以创建一个实现相同接口但始终返回所需数据的模拟类,这样您就不必担心实际数据库会返回正确的数据以供测试使用。它还非常有用,可以让其他开发人员为您的代码编写插件,这仅仅是为了初学者。如果您没有编写插件呢课堂上的大项目很少有一个程序员在做(很抱歉有两个回复,但我没有空间只写一条评论)。非常感谢!
class Tweety implements Fliers{
    public function fly() {
    // some stuff
    }
}
interface ThingWithDoors {
    public function openDoors ();
}

class House implements ThingWithDoors {
    // Implement openDoors here
}

class CanalLock implements ThingWithDoors {
    // Implement openDoors here
}

class Boeing747 extends Aircraft implements ThingWithDoors {
    // Implement openDoors here
}

// Calling code

if ($object instanceof ThingWithDoors) {
    // We don't know exactly what class we have, but we do know it has an openDoors method
    $object -> openDoors ();
}