我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PB协议(二)Protobuf的PHP开发教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PB协议(二)Protobuf的PHP开发教程

本系列文章目录 展开/收起

本文介绍PB协议与PHP语言相关的特性和知识点,以及如何使用PHP解析pb协议。


· packages

proto文件指定了package后,在编译为PHP文件时会根据package包名路径为构建出的PHP文件设置命名空间,并且创建对应命名空间的目录。

package foo.bar;message MyMessage {}

protoc编译器会为上述proto文件生成的PHP文件设置命名空间为 “Foo\Bar\MyMessage”。


· Messages

message Person {    string name = 1;    int32 age = 2;    string sex = 3;}


如上所示,PB编译器生成PHP代码后,PHP代码里会包含一个Foo的类。Foo类继承了PB提供的Message基类,Message基类提供了一系列的访问器和修改器供我们访问和修改message中的字段。

$person = new Test\Person();$person->setName("lailaiji");$person->setAge("28");$person->setSex(true);$data = $person->serializeToString();file_put_contents('data.bin',$data);


又例如:

$m = new MyMessage();$m->setX(1);$val = $m->getX();$a = 1;$m->setX($a);


Message对象还提供了序列化和反序列化的方法。

serializeToString:序列化成二进制字符串

serializeToJsonString:序列化成JSON字符串

mergeFromString:二进制字符串反序列化

mergeFromJsonString:Json字符串反序列化


序列化示例

setName("lailaiji");$person->setAge("28");$person->setSex(true);$data = $person->serializeToString();file_put_contents('data.bin',$data);


反序列化示例

mergeFromString($bindata);echo $person->getName();


获取一个已有内容的message的所有字段值

$json = $message->serializeToJsonString();$data = json_decode($json, true);


注意:

当你使用修改器(set方法)修改message的一个字段时,PHP 会根据该字段的声明类型对该值进行类型检查。如果值的类型错误(或超出范围),则会引发异常。默认情况下,允许在整数、浮点数和数字字符串之间进行类型转换。不允许的转换包括与数组或对象的所有转换。


消息类型的字段(即字段的类型是一个嵌套message)的默认值是null,且访问该字段时不会自动创建。因此,您需要显式创建子消息。

例如:

$m = new MyMessage();$m->setZ(new SubMessage());$m->getZ()->setFoo(42);$m2 = new MyMessage();$m2->getZ()->setFoo(42);  // 报错,原因是getZ()返回null


repeated字段和map字段的操作类似数组

proto文件内容:

repeated int32 foo = 1;map weight = 1;


生成的PHP代码允许您执行此操作:

$m->getFoo()[] =1;$m->setFoo($array);$m->getWeight()[1] = 1;

需要注意,PHP中使用message对象的访问器获取一个repeated对象时,返回的是一个RepeatedField对象,而非数组。如果需要得到数组,可以使用iterator_to_array()函数。

$foo = iterator_to_array($m->getFoo();


PHP没有原生枚举,因此PB编译器会为.proto文件中的每个枚举类型生成一个 PHP 类。

enum TestEnum {  Default = 0;  A = 1;}

编译后:

class TestEnum {  const DEFAULT = 0;  const A = 1;}


对于oneof,PB 编译器生成与常规单数字段相同的代码,但还添加了一个特殊的访问器方法,可让您找出设置了哪个 oneof 字段(如果有)。此时如果要用访问器或修改器方法,就不再是get某个具体字段。

message TestMessage {  oneof test_oneof {    int32 oneof_int32 = 1;    int64 oneof_int64 = 2;  }}


编译器编译成的PHP文件会生成以下字段和特殊方法:

class TestMessage {  private oneof_int32;  private oneof_int64;  public function getOneofInt32();  public function setOneofInt32($var);  public function getOneofInt64();  public function setOneofInt64($var);  public function getTestOneof();  // 返回字段名}

访问器方法的名称基于 oneof 的名称,并返回一个枚举值,该值表示当前设置的 oneof 中的字段值。


对any类型的字段设置值时,不能够直接设置而是要使用setValue()方法。

message TestProductAttr{    map attr = 1;}


正确做法:

$attrs = ["color"=>"read", "size"=>16];$attrPb = new \protobuf\Test\TestProductAttr();foreach($attr as $k=>$v){    $any = new \Google\Protobuf\Any();    $any->setTypeUrl('type.googleapis.com/google.protobuf.StringValue');    $any->setValue($v);    $attr[$k] = $any;}$attrPb->setAttr($attrs);

需要注意,any类型是一种泛型,因此设置的时候必须指定any实际的类型,否则在反编码的时候程序就不知道应该按整型、字符串还是map或数组等类型对其进行反编码。因此 protobuf 提供了type url属性供用户指明一个any类型的值应该按protobuf规定的哪种类型进行编码和反编码。

type url的格式一般为 type.googleapis.com/包名.message名,例如type.googleapis.com/google.protobuf.StringValue 就表示要按照protobuf官方内置的 StringValue这种内置的message类型对any类型进行解析,也就是解析为字符串格式。


protobuf内置的message类型可以在 google/protobuf 目录中查看,该目录是PHP使用composer安装 google/protobuf 依赖时生成的。





更多内容请关注微信公众号:程序员阿沛 本文转载自:
张柏沛IT技术博客 > PB协议(二)Protobuf的PHP开发教程

来源地址:https://blog.csdn.net/jqsfjqsf/article/details/127473567

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PB协议(二)Protobuf的PHP开发教程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP Websocket开发教程,构建实时团队协作功能

PHP Websocket开发教程,构建实时团队协作功能前言:随着互联网技术的迅猛发展,越来越多的Web应用程序需要实时通信来实现实时数据更新和实时团队协作等功能。这时候Websocket技术就显得尤为重要,而PHP作为广泛应用于Web开发
PHP Websocket开发教程,构建实时团队协作功能
2023-12-09

PHP异步协程开发:构建高可用的在线教育平台

PHP异步协程开发:构建高可用的在线教育平台概述:随着互联网的迅猛发展和全球疫情的影响,在线教育平台成为教育行业的重要组成部分。为了提供高效稳定的服务,以及应对大量并发请求,采用异步协程开发成为一个不可或缺的选择。本文就如何使用PHP异步协
PHP异步协程开发:构建高可用的在线教育平台
2023-12-09

PHP异步协程开发:优化邮件发送的速度与稳定性

PHP异步协程开发:优化邮件发送的速度与稳定性引言:在现代的互联网应用中,邮件发送是一个非常重要的功能,无论是用户注册验证、订单确认还是密码重置等等,都离不开邮件的发送。然而,传统的同步邮件发送方式在处理大量邮件发送时往往效率低下且不稳定。
PHP异步协程开发:优化邮件发送的速度与稳定性
2023-12-18

PHP异步协程开发:构建高可用的支付系统

PHP异步协程开发:构建高可用的支付系统随着电子支付系统的普及,对于支付系统的高可用性要求也越来越高。传统的同步阻塞模型在面对高并发请求时,性能会有所限制。异步协程开发成为了一种解决方案,它能够提升系统的性能和可靠性。本文将介绍如何使用PH
PHP异步协程开发:构建高可用的支付系统
2023-12-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录