gpt4 book ai didi

php - 接口(interface)的真实实现

转载 作者:行者123 更新时间:2023-12-04 04:49:19 26 4
gpt4 key购买 nike

这个问题听起来很明显,也可能很愚蠢。但我想弄清楚为什么我需要使用接口(interface)?我想我可以处理接口(interface)使用类所做的大部分事情,那么使用它们有什么意义呢?确实,如果我不使用接口(interface),我可能会遇到问题,但我想弄清楚不使用接口(interface)会导致什么问题?

接口(interface)的一种用途是它们允许我们定义行为并对实现它们的类施加限制。

另一个用途是接口(interface)作为类型工作,我可以使用接口(interface)进行类型提示,如下所示。

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

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

但是 PHP 中接口(interface)还有其他用途吗?

IE。在下面的代码中使用接口(interface)有什么好处。
//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());
?>

最佳答案

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

接口(interface)对于像我这样的库/可重用代码编写者非常有用:) 它们是必须遵守的代码契约(Contract)。 您知道任何实现它们的类都将具有一组与接口(interface)声明它们完全相同的函数。 您还可以在函数参数中静态键入它们,如 function(MyInterface $Object)在 PHP 编译器级别强制执行 $Object必须实现MyInterface .

PS : 抽象类对于其他使用自写代码的开发人员来说已经足够好了......

更新 :

/**
* 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();
}
}

^ 代码应该不言自明。

关于php - 接口(interface)的真实实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17678799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com