2013-07-16 106 views
2

这个问题听起来很明显,也可能是愚蠢的。但我想弄清楚为什么我需要使用接口?我认为我可以处理接口使用类的大部分事情,那么使用它们有什么意义?确实,如果我不接口,我可能会遇到问题,但我试图找出不使用接口导致的问题。真实世界的接口实现

接口的一种用法是它们允许我们定义行为并对实现它们的类进行限制。

另一个用途是将接口工作为类型,我可以使用类型提示的接口,如下所示。

//Java example 
public interface IPaintable{ 
    void Paint(System.Drawing.Color color); 
} 

public void Paint(IPaintable item, System.Drawing.Color color){ 
    item.Paint(color); 
} 

但是在PHP中有没有其他使用接口?

I.e.通过使用下面的代码中的接口,我可以获得什么优势。

//Non interface implementation 
    <?php 
    class DBPersonProvider 
    { 
     public function getPerson($givenName, $familyName) 
     { 
      /* go to the database, get the person... */ 
      $person = new Person(); 
      $person->setPrefix("Mr."); 
      $person->setGivenName("John"); 
      return $person; 
     } 
    } 

    /* I need to get person data... */ 
    $provider = new DBPersonProvider(); 
    $person = $provider->getPerson("John", "Doe"); 

    echo($person->getPrefix()); 
    echo($person->getGivenName()); 

    ?> 

    //Implementation with interface 

     <?php 
     interface PersonProvider 
     { 
      public function getPerson($givenName, $familyName); 
     } 

     class DBPersonProvider implements PersonProvider 
     { 
      public function getPerson($givenName, $familyName) 
      { 
      /* pretend to go to the database, get the person... */ 
      $person = new Person(); 
      $person->setPrefix("Mr."); 
      $person->setGivenName("John"); 
      return $person; 
     } 
    } 


    /* I need to get person data... */ 
    $provider = new DBPersonProvider(); 
    $person = $provider->getPerson("John", "Doe"); 

    echo($person->getPrefix()); 
    echo($person->getGivenName()); 
    ?> 
+0

您使用接口定义**协议**。你得到的是可靠性的基础。想象一下'人'。每个人都有一个有器官的身体。因此你的界面会实现器官。每个人都不同。约翰,杰克,迈克尔,克里斯蒂娜等都是不同的,但都是由功能相同的部件组成的。因此,当你创建一个新的人时,你可以**创建它们的核心部分,它们可以互相协作并使身体工作。这就是接口在那里的原因 - 他们在任何实施类上强制执行协议。 –

+0

同意。我在我的问题中指出了这一点:“接口的一个用途是它们允许我们定义行为并对实现它们的类进行限制。” –

+1

这就是你所得到的。使用接口没有其他好处。如果你有一个小项目,你可能不会受益太多。然而,如果你有50人正在开发一个项目,并且你是一个功能的核心开发人员 - 那么使用一个由抽象类实现的接口是一个明智的举动,然后由其他开发人员的类进行扩展。你只是执行一个协议。这大多是建筑和组织方面的事情。 –

回答

1

我写了一个很好的库,与数据库交互。而我使用MySQL。当你购买我的图书馆时,你知道它是基于MySQL,但是你用SQL Server滚动。 我非常体贴为数据库访问创建接口。我提供了一个MySQL的实现。现在,您可以在我的数据库访问界面上实现自己的SQL Server包装,然后将其用作库中用于将存储更改为SQL Server的类中的类的__construct()参数。

接口是库/可重用的代码编写者非常有用像我 :)他们是必须要遵守的代码合同。 您知道任何实现它们的类都将具有与接口声明的完全一样的功能。你也可以在函数参数中静态地键入它们,如function(MyInterface $Object),它在PHP编译器级别强制$Object必须实现MyInterface

PS抽象类是用于自写代码的开发人员耗费休息不够好...

UPDATE

/** 
* Database Access functionality blueprint. 
*/ 
interface IDatabaseAccess { 
    public function Connect(); 
    public function Query(); 
    public function Fetch(); 
} 

/** 
* Database Access functionality implementation for MySQL. 
*/ 
class MySqlDatabaseAccess implements IDatabaseAccess { 
    public function Query(){ 
     // do mysql stuff 
    } 
    public function Fetch(){ 
     // do mysql stuff 
    } 
} 

/** 
* Database Access functionality implementation for SQLServer. 
*/ 
class SqlServerDatabaseAccess implements IDatabaseAccess { 
    public function Query(){ 
     // do sqlserver stuff 
    } 
    public function Fetch(){ 
     // do sqlserver stuff 
    } 
} 

/** 
* Database Access consumer that's database system agnostic. 
*/ 
class DatabaseAccessConsumer { 
    protected $_Provider = null; 
    public function __construct(IDatabaseAccess $Provider){ 
     $this->_Provider = $Provider; 
     $this->_Provider->Connect(); 
    } 
    public function Query(){ 
     return $this->_Provider->Query(); 
    } 
    public function Fetch(){ 
     return $this->_Provider->Fetch(); 
    } 
} 

^代码,应该讲本身

+0

同意。我已经准备好在我的问题中指出这一点。 “接口的一个用途是它允许我们定义行为并对实现它们的类进行限制。” –

+0

@JayBhatt那么你还需要什么? – CodeAngry

+0

如果我正在构建商业产品,我肯定会使用接口,因为它们将为未来的开发提供良好的方向。我正在编写一个简单的应用程序,在这种情况下,界面提供了什么优势? –

1

接口实际上比抽象类提供更少的功能(你不能实现任何东西)。

但他们解决了多重继承的问题。大多数现代语言不允许一个班级派生多个班级。通过使用一个没有实现任何方法的接口,当你从接口调用一个方法时(因为没有实现),你肯定没有不明确之处。

示例(语法上无效):

class A { 
    public foo() { 
     echo 'I am A and I foo'; 
    }; 
    public 
} 

class B { 
    public foo() { 
     echo 'I am B and I foo'; 
    } 
} 

class C extends A, B { // invalid 
    public bar() { 
     foo(); // which one? A's or B's? 
    } 
} 

第二个例子:

class A { 
    public foo() { 
     echo 'I am A and I foo'; 
    }; 
} 

interface iB { 
    public foo(); 
    public bar(); 
} 

interface iC { 
    public foo(); 
    public qux(); 
} 

class D extends A implements iB, iC { 

    public bar() { 
     foo(); // no ambiguity, this is A::foo(), even if the method is also declared in the interfaces 
    } 

    public qux() {} 
} 
1

接口都只是类蓝图 - 他们说:“如果你打算做什么用的方式这种班级,它必须有这个,并做到这一点。“它允许您在某种程度上控制另一个班级在特定情况下的最小程度。并非每种情况都需要一个iterface。当需要对某些类的基本代码进行一些控制时,最好使用接口,但您可能不是编写它们的人。如果你知道扩展类将有x属性和y方法,那么你可以做基本的未来类支持。