PHP的interface有什么用处?
一、PHP的interface有什么用处
PHP 中的 Interface 在工程项目中是非常有用的。其最大的用处就在于
为未来的类切换与拓展保留足够的兼容性
这种灵活地兼容性,是一个 PHP项目多年维护后才能体会到的。
这里我以 Laravel 框架的工程项目举例说明。
比如我们有一个数据表,名为 products ,里面存储了许多商品的信息。
对于新手来说,要对这个类进行操作,一般的做法就是建立一个 控制器(Controller),将对于该表的 “新改读删(CURD)”都放在其中。这是官方教程中的方法
php
namespace App\Http\Controller;
…
class ProductController extends Controller
{
public function index(){ … };
public function create(Request $request){ … };
….
}
?>
这样并不错,但未来要做修改的时候,每次都要修改这个类,而有的操作其实是反复写的,无法复用。
所以在工程项目中,一般都不会按照 官方教程这么写,这里就需要用 interface 了。
我们先建立一个针对 Product 的服务操作接口
php
namespace App\Repositories\Product;
interface ProductRepository{
public function create(array $data);
public function find($id=null);
public function delete($id=null);
….
}
?>
这里定义了所需的功能函数,再实现一个对应的类
php
namespace App\Repositories\Product;
use App\Models\Product;
class ProductEloquent implememts ProductReposity
{
public function create(array $data){ … };
public function find($id=null){ … };
public function delete($id=null){ … };
….
}
?>
将原有的 Controller 类拆分到两个文件中,我们就可以完成如下工作:
以后该项目中所有与 Product 相关的操作,都不再关联到 ProductEloquent 类,而关联到 ProductReposity 接口上。php
/** use App\Repositories\ProductEloquent; **/
use App\Repositories\ProductReposity;
?>
再利用 Laravel 的服务注册,将接口与实际类关联起来。这个功能在 AppServiceProviders.php 中增加如下的代码。php
namespace App\Providers;
use App\Repositories\ProductRepository;
use App\Repositories\ProductEloquent;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(ProductRepository::class, ProductEloquent::class);
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
}
这样我们可以在项目中针对某个功能,做多个实现类,每个类仅需在注册的时候进行切换就可以了。这种方法打补丁、做修改,都是局部的,而不会影响到全局,在一个 PHP Laravel 项目多年运行中是非常有效的。
延伸阅读:
二、data是什么
data 用来保存实际变量的地址。
data 中的内容会根据实际情况变化,因为 golang 在函数传参和赋值时是 值传递 的,所以:
如果实际类型是一个值,那么 interface 会保存这个值的一份拷贝。interface 会在堆上为这个值分配一块内存,然后 data 指向它。如果实际类型是一个指针,那么 interface 会保存这个指针的一份拷贝。由于 data 的长度恰好能保存这个指针的内容,所以 data 中存储的就是指针的值。它和实际数据指向的是同一个变量。
相关推荐HOT
更多>>
如何使用Pandas处理Excel?
如何使用Pandas处理Excel?做过行政或者人事,或者对此有过了解的小伙伴,一定对下发各个部分的表有着非常深刻的印象,最常见的就是需要我们将一...详情>>
2023-11-14 07:43:15
python中np.insert()函数的使用方法
python中np.insert()函数的使用方法在numpy数组操作中,np.append()方法可以在每行每列的最后添加数据,但其位置是规定的,那如果想要指定添加...详情>>
2023-11-14 05:06:13
SVM在python中的原理如何理解?
SVM在python中的原理如何理解?在python中除了编程化的知识点外,对于数学方法的算法也有所涉及,SVM就是一种很好地体现。我们学习过数学中的坐...详情>>
2023-11-14 04:30:04
python处理绝对路径和相对路径函数有哪些?
python处理绝对路径和相对路径函数有哪些?绝对路径和相对路径是什么?绝对路径:从根文件夹开始,Windows系统以盘符(C:)作为根文件夹,OSX或Lin...详情>>
2023-11-14 03:33:02热门推荐
如何使用python any()判断多元素?
沸如何使用Pandas处理Excel?
热python函数中的参数有哪些?
热python中pygal模块如何使用?
新Python的excel处理操作
python中doctest库是什么?
python中series是什么意思
python中np.insert()函数的使用方法
SVM在python中的原理如何理解?
Python描述符中有哪三种方法?
python处理绝对路径和相对路径函数有哪些?
python单继承和多继承如何定义?
python封装中的私有如何理解?
python模块引入的三种方式
技术干货






