全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货  >  详情

PHP的interface有什么用处?

来源:千锋教育
发布人:xqq
2023-10-21

推荐

在线提问>>

一、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 中存储的就是指针的值。它和实际数据指向的是同一个变量。

相关文章

如何使用python any()判断多元素?

如何使用Pandas处理Excel?

python函数中的参数有哪些?

python中pygal模块如何使用?

Python的excel处理操作

开班信息 更多>>

课程名称
全部学科
咨询

HTML5大前端

Java分布式开发

Python数据分析

Linux运维+云计算

全栈软件测试

大数据+数据智能

智能物联网+嵌入式

网络安全

全链路UI/UE设计

Unity游戏开发

新媒体短视频直播电商

影视剪辑包装

游戏原画