2014-12-19 165 views
0

我刚刚学习了PHP的接口,因为我从来没有真正使用它们,但据我所知,它们只是一个接口,因为它们被称为,以坚持如何实现它们的类是结构化的?只是描述接口描述实现需要做什么?

因此,举例来说,如果你想使两个不同班两个不同的数据库,你可以这样做:

class mysql { 

    public function connect() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

class mongoDB { 

    public function connect() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

...这在技术上是相同的:

interface database { 

     public function connect() { 

     } 

     public function getData() { 

     } 

} 

class mysql implements database { 

    public function connect() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

class mongoDB implements database { 

    public function connect() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

...我对吗?这只是使用一个接口,它确保你不会去做类似于下面的事情,因此不能轻松更改数据库?

class mysql { 

    public function connect_mysql() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

class mongoDB { 

    public function connect_mongo() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

这几乎是他们背后的推理吗?

+0

你是对的。对象接口允许您创建代码,以指定类必须实现哪些方法,而无需定义如何处理这些方法。 – daker 2014-12-19 07:28:35

+1

非常正确,但'interfaces'函数不能有一个body,所以你声明它们是'public function getData();'而不是'public function getData(){}'。 – Jite 2014-12-19 07:29:53

+0

是的,你知道了:--D请记住,一个类可以有很多不同类型的接口 – donald123 2014-12-19 07:32:35

回答

1

接口的作用是标准化您的代码可以依赖的内容,同时将其从特定的实现中分离出来。哇,这听起来很复杂。它很容易从接口用户的角度说明吧:

function (MyDatabaseInterface $db) { 
    $db->connect(); 
    $db->getData(); 
} 

类型提示是使用接口的重要组成部分。该函数声明其参数必须是MyDatabaseInterface的实例,换句话说,任何对象implements MyDatabaseInterface。这完全取决于你是什么具体的对象,只要它implements MyDatabaseInterface。由于您在MyDatabaseInterface中指定了方法connect()getData(),您可以确定传入的任何对象都具有这些方法并且可以调用它们。

周围的其他方法,看看这个函数:

/** 
* @return MyDatabaseInterface 
*/ 
function foo() { 
    ... 
} 

这是无关紧要的东西这个函数在内部做,但它宣布它将返回MyDatabaseInterface类型的对象,换句话说,某些对象那implements MyDatabaseInterface。当你打电话,你知道你可以依靠什么在:

$bar = foo(); 
$bar->connect(); 
$bar->getData(); 

这个函数可以返回的mysqlmongoDB一个实例,它是关你的事。您只需坚持接口中声明的内容,无论您获得什么特定对象,代码都可以工作。

字面上的界面定义了代码之间的界面。它定义了代码可以安全地调用其他代码的方法,而无需将具体细节关联到特定的类。你的特定对象可以定义比接口中定义的更多的方法;一个接口不会声明一个类结构。一个类可以同时实现多个接口,这意味着它实现了所有接口的所有方法;每个单独的接口将仅代表可以在对象上调用的所有可能方法的子集。

您应该描述可以在界面中完成的特定“任务”或“能力”,而不是“类”。如果您的接口名称以“-able”结尾,如Iterable,这是一个好兆头。然后一个类可以实现多个接口,从而描述它“可以做”的所有事情。然后,您可以在特定点上使用具有某种“能力”的函数参数,如上面的示例代码所示。这样可以将部分代码彼此隔离并解耦,这使得您的代码更加灵活,可重用,并且可以随时更改。


对于一个有用的现实世界场景,想象一个更大的开发团队正在开发一个大型项目。有几个子小组,每个小组负责应用程序的不同部分。他们都一起坐下来制定一个总体计划。在某些时候,这些独立团队的代码需要相互交流。他们可以定义这些接口前期:

  • “我需要打电话给你的代码的一些方法,让我的用户凭据。” “好吧,那么你需要给我一些东西,我可以从中获得foobar。” “
  • ”然后在这里,我们将不得不与Joe的组件交谈以发送baz数据。“
  • ...

他们可以定义他们需要互相对话的任何代码已被写入之前的界面,然后熄灭,做好自己的事情的不同方法。他们可以依赖尚未编写的代码,因为他们已经决定了界面的外观。他们甚至可以用模拟对象代替真正的代码,而Joe仍然在琢磨他的真实代码,然后随着乔随之而来的切换。即使你只是自己工作,所有这些技巧都很有用。