Laravel 界面

use*_*781 1 php laravel-4

最近我看到《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)

因此,在这个示例中,您将功能分解为更小的类,以便您可以添加、删除甚至更改它们,而不会破坏其他内容。