最近我看到《Laravel 4 From Apprentice to Artisan》一书中的界面,示例如下:
interface UserRepositoryInterface {
public function all();
}
class DbUserRepository implements UserRepositoryInterface {
public function all()
{
return User::all()->toArray();
}
}
Run Code Online (Sandbox Code Playgroud)
什么是接口?接口文件放在哪里?
小智 5
接口是其自身与任何实现该接口的类之间的“契约”。该契约规定,任何实现该接口的类都应该具有该接口中定义的所有方法。在这种情况下,DbUserRepository 必须有一个名为“all()”的方法,否则在实例化该类时会发生致命错误。
接口文件可以放在任何地方,但最简单的是将其放在与实现它的类相同的目录中。
该界面的用途如下:假设您想要更改应用程序不再使用数据库(和 Eloquent),现在您要将数据存储在 JSON 文件中,并编写自己的方法来与 JSON 文件交互。现在您可以创建一个新的存储库(例如 JSONRepository)并让它实现 UserRepositoryInterface,并且因为该接口强制您定义接口中定义的所有相同方法,所以您现在可以确保您的应用程序将继续像以前一样工作。所有这一切都无需修改现有代码。
数据库示例对我来说并没有多大现实意义,因为我不太可能如此彻底地改变我的存储系统,而且这个示例总是让人觉得接口只有一个非常小的用例,这与事实相差甚远。真相。编写接口代码对您和您的应用程序有很多好处。
正在使用的接口的另一个示例可以是:
假设您有一个 Calculator 类,最初它可以执行两个操作(加法和乘法)。但是几周后您需要添加另一个操作(例如减法),现在通常这意味着您必须修改计算器类,从而有破坏它的风险。但是,如果您使用的是接口,则只需创建 Subtraction 类并让它实现 CalculationInterface,现在您的应用程序就可以执行新操作,而无需触及现有代码。
例子:
计算器.php
<?php
class Calculator {
protected $result = null;
protected $numbers = [];
protected $calculation;
public function getResult()
{
return $this->result;
}
public function setNumbers()
{
$this->numbers = func_get_args();
}
public function setCalculation(CalculationInterface $calculation)
{
$this->calculation = $calculation;
}
public function calculate()
{
foreach ($this->numbers as $num)
{
$this->result = $this->calculation->run($num, $this->result);
}
return $this->result;
}
}
Run Code Online (Sandbox Code Playgroud)
计算接口.php
<?php
interface CalculationInterface {
public function run($num, $current);
}
Run Code Online (Sandbox Code Playgroud)
加法.php
<?php
class Addition implements CalculationInterface {
public function run($num, $current)
{
return $current + $num;
}
}
Run Code Online (Sandbox Code Playgroud)
乘法.php
<?php
class Multiplication implements CalculationInterface {
public function run($num, $current)
{
/* if this is the first operation just return $num
so that we don't try to multiply $num with null */
if (is_null($current))
return $num;
return $current * $num;
}
}
Run Code Online (Sandbox Code Playgroud)
然后运行计算方法:
$this->calc = new Calculator;
$this->calc->setNumbers(5, 3, 7, 10);
$this->calc->setCalculation(new Addition);
$result = $this->calc->calculate(); //$result = 25
Run Code Online (Sandbox Code Playgroud)
现在,如果您想添加一个新操作(假设是 Subtraction),您只需创建 Subtraction 类并让它实现 CalculationInterface:
<?php
class Subtraction implements CalculationInterface {
public function run($num, $current)
{
/* if this is the first operation just return $num
so that we don't try to subtract from null */
if (is_null($current))
return $num;
return $current - $num;
}
}
Run Code Online (Sandbox Code Playgroud)
然后运行它:
$this->calc = new Calculator;
$this->calc->setNumbers(30, 3, 7, 10);
$this->calc->setCalculation(new Subtraction);
$result = $this->calc->calculate(); //$result = 10
Run Code Online (Sandbox Code Playgroud)
因此,在这个示例中,您将功能分解为更小的类,以便您可以添加、删除甚至更改它们,而不会破坏其他内容。