Php 拉威尔界面

Php 拉威尔界面,php,laravel-4,Php,Laravel 4,最近,我在《拉威尔4从学徒到工匠》一书中看到了这样一个界面,示例如下: interface UserRepositoryInterface { public function all(); } class DbUserRepository implements UserRepositoryInterface { public function all() { return User::all()->toArray(); } } 什么是接

最近,我在《拉威尔4从学徒到工匠》一书中看到了这样一个界面,示例如下:

interface UserRepositoryInterface {
    public function all();
}

class DbUserRepository implements UserRepositoryInterface {
    public function all()
    {
        return User::all()->toArray();
    }
} 
什么是接口?将接口文件放在哪里?

接口是接口本身与实现接口的任何类之间的“契约”。 契约规定,实现接口的任何类都应该在接口中定义所有方法。 在这种情况下,DbUserRepository必须有一个名为“all()”的方法,否则在实例化该类时将发生致命错误

接口文件可以放在任何地方,但最简单的方法是将其与实现它的类放在同一目录中

接口的目的如下: 假设你想改变你的应用程序,不再使用数据库(而且很有说服力),现在你要将数据存储在JSON文件中,并编写自己的方法来与JSON文件交互。现在,您可以创建一个新的存储库,例如JSONRepository,并让它实现UserRepositoryInterface,并且由于该接口强制您定义接口中定义的所有相同方法,因此您现在可以确保您的应用程序将继续像以前一样工作。所有这些都不需要修改现有代码

数据库示例对我来说并没有太大的现实意义,因为我不太可能如此彻底地更改存储系统,而且该示例总是让界面看起来只有一个非常小的用例,这与事实相差甚远。 编写接口代码对您和您的应用程序有很多好处

另一个正在使用的接口示例可以是:

假设您有一个计算器类,最初它有两个可以执行的操作(加法和乘法)。但是几周后,您需要添加另一个操作(例如减法),现在通常这意味着您必须修改calculator类,从而有可能破坏它。 但是如果你使用的是一个接口,你可以创建一个减法类,让它实现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;
    }


}
现在,如果您想添加一个新的操作,比如说减法,您只需创建减法类并让它实现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;
    }
}
因此,在本例中,您将功能分解为更小的类,以便您可以添加、删除甚至更改它们,而无需分解其他内容。

接口是接口本身与实现接口的任何类之间的“契约”。 契约规定,实现接口的任何类都应该在接口中定义所有方法。 在这种情况下,DbUserRepository必须有一个名为“all()”的方法,否则在实例化该类时将发生致命错误

接口文件可以放在任何地方,但最简单的方法是将其与实现它的类放在同一目录中

接口的目的如下: 假设你想改变你的应用程序,不再使用数据库(而且很有说服力),现在你要将数据存储在JSON文件中,并编写自己的方法来与JSON文件交互。现在,您可以创建一个新的存储库,例如JSONRepository,并让它实现UserRepositoryInterface,并且由于该接口强制您定义接口中定义的所有相同方法,因此您现在可以确保您的应用程序将继续像以前一样工作。所有这些都不需要修改现有代码

数据库示例对我来说并没有太大的现实意义,因为我不太可能如此彻底地更改存储系统,而且该示例总是让界面看起来只有一个非常小的用例,这与事实相差甚远。 编写接口代码对您和您的应用程序有很多好处

另一个正在使用的接口示例可以是:

假设您有一个计算器类,最初它有两个可以执行的操作(加法和乘法)。但是几周后,您需要添加另一个操作(例如减法),现在通常这意味着您必须修改calculator类,从而有可能破坏它。 但是如果你使用的是一个接口,你可以创建一个减法类,让它实现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;
    }


}
现在,如果您想添加一个新的操作,比如说减法,您只需创建减法类并让它实现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;
    }
}

因此,在本例中,您将功能分解为更小的类,这样您就可以添加、删除甚至更改它们,而无需分解其他内容。

您可以在中阅读有关接口的信息,也可以在Google上进行搜索。至于将文件放在何处,没有特定的约定,尽管将包含公共功能的文件分组在同一目录中是一种良好的做法(请查看您的
供应商
目录中的Laravel模块结构)。至于接口是什么,我建议阅读OOP和PHP手册,了解它们是如何在PHP中实现的。至于放在哪里,这取决于你:我通常会创建一个“接口”文件夹,将其添加到自动加载的目录中,然后放在那里。你可以在中阅读有关接口的内容,也可以在谷歌上搜索。至于将文件放在何处,没有特定的约定,尽管将包含公共功能的文件分组在同一目录中是一种良好的做法(请查看您的
供应商
目录中的Laravel模块结构)。至于接口是什么,我建议阅读OOP和PHP手册,了解它们是如何在PHP中实现的。至于放在哪里,这取决于你:我通常创建一个“接口”文件夹,将其添加到自动加载的目录中,然后放在那里。
$this->calc = new Calculator;
$this->calc->setNumbers(5, 3, 7, 10);
$this->calc->setCalculation(new Addition);
$result = $this->calc->calculate(); //$result = 25 
<?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;
    }
}
$this->calc = new Calculator;
$this->calc->setNumbers(30, 3, 7, 10);
$this->calc->setCalculation(new Subtraction);
$result = $this->calc->calculate(); //$result = 10