关于oop:php:接口的概念?

PHP:Concept of interfaces?

本问题已经有最佳答案,请猛点这里访问。

有人能用很好的例子解释接口的概念吗?我搜索了一下,但没有找到一个好答案。我仍然对这些概念感到困惑。

我找到了一个Internet接口示例,如下所示。代码在没有具有相同输出的接口的情况下工作。那么它的目的是什么呢?或者它不是接口的真正实现?.I需要从过程编码转向面向对象编程。如果没有人能用更复杂的技术词汇来解释,那就更好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 <?php
interface IPillage
{
public function emptyBankAccounts();
public function burnDocuments();
}

class  Employee
{
public function emptyBankAccounts()
{
echo"Call employees and ask to transfer funds to Swiss bank account";
}
public function burnDocuments()
{
echo"Torch the office suite of the employee";
}

}

class Executive  extends Employee implements IPillage
{
public function emptyBankAccounts()
{
echo"Call executive and ask to transfer funds to Swiss bank account";
}
public function burnDocuments()
{
echo"Torch the office suite of the executive";
}

}
$obj1=new Employee();
$obj2=new Executive();
$obj1->emptyBankAccounts();
echo '';
$obj2->emptyBankAccounts();
?>


许多语言只允许单一继承,有了接口,您就可以拥有一种多重继承…您可以从基类继承,同时也可以从许多接口继承。例如,您可以有许多类,如..人,动物,卡车。当然,它们是不同的,但是它们可以用一个名为"to move"的方法实现类似"movable"的接口。在这种情况下,我可以参考三种不同的物体从光学的"可移动元件"。我可以说我的人类。移动/我的猴子。移动/我的卡车。移动……我确信我可以请求移动到任何实现可移动接口的对象,而不必关心特定对象可以做的其他事情…为了考虑一个接口,我必须考虑它们提供的功能。对不起,我是阿根廷人。尼古拉斯·佩里克恩


正如Prades所写,创建接口创建了一种契约。这确实是这里的关键概念。

假设您正在与其他开发人员团队一起开发一个项目。有几个新的类需要编写,团队希望就一个通用的方法/设计模式达成共识。每个人都同意这些类都需要一个foo方法、一个bar方法和一个baz方法。这些方法将如何工作的具体细节在每个类中都会略有不同。但是,它们应该具有相同的签名。

我们决定创建一个接口,命名每个类应该拥有的方法(foo、bar、baz)和它们的签名(即它们采用的参数)。现在,当我们每个人编写这些新类中的一个时,我们将"实现"接口。通过声明"myClass"实现"myInterface",我们现在需要在我们的类中实现foo、bar和baz方法。如果不这样做,我们的IDE、编译器、运行时环境等将抛出一个错误。


接口:

无法实例化。是一种特殊类型的抽象类,其中所有成员都没有任何实现。启用多态性。类可以实现多个接口。通常用于应用程序类:为确保交互性提供契约。

目标:确保某些东西可以互换。实现接口的类需要包含所有实现,否则编译器将抛出错误。能干的关系。例如,学生可以报名,学生可以提交作业。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  public interface ICanEnrol
{
    void Enrol();
}

public interface ICanSubmit
{
    void Submit();
}

public class Student : ICanEnrol, ICanSubmit
{
    public void Enrol()
    {
        School.Send("enrolment");
    }

    public void Submit()
    {
        School.Send("report");
    }
}

public class Employee : ICanEnrol, ICanSubmit
{
    public void Enrol()
    {
        Company.Send("enrolment");
    }

    public void Submit()
    {
        Company.Send("report");
    }
}