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