返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PB协议(二)Protobuf的PHP开发教程
  • 149
分享到

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

phpprotobufpb协议 2023-09-07 13:09:42 149人浏览 独家记忆
摘要

本系列文章目录 展开/收起 PB协议(一)什么是Pb协议(Protobuf),Pb协议如何使用,PB协议的数据类型 PB协议(二)Protobuf的PHP开发教程 本文介绍PB协议与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

--结束END--

本文标题: PB协议(二)Protobuf的PHP开发教程

本文链接: https://lsjlt.com/news/398288.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PB协议(二)Protobuf的PHP开发教程
    本系列文章目录 展开/收起 PB协议(一)什么是Pb协议(Protobuf),Pb协议如何使用,PB协议的数据类型 PB协议(二)Protobuf的PHP开发教程 本文介绍PB协议与PHP语言相关的特性和...
    99+
    2023-09-07
    php protobuf pb协议
  • Python Web开发中的WSGI协议
     在Python Web开发中,我们一般使用Flask、Django等web框架来开发应用程序,生产环境中将应用部署到Apache、Nginx等web服务器时,还需要uWSGI或者Gunicorn。一个完整的部署应该类似这样: Web ...
    99+
    2023-01-31
    协议 Python Web
  • Git和HTTP协议如何影响PHP开发者的工作流程?
    在当今的Web开发中,Git和HTTP协议已经成为了不可或缺的工具和协议。Git是一种分布式版本控制系统,而HTTP协议则是Web应用程序之间数据传输的协议。本文将探讨Git和HTTP协议如何影响PHP开发者的工作流程。 Git如何影响P...
    99+
    2023-06-30
    http 关键字 git
  • Swift中的协议(protocol)学习教程
    一、引言 协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有...
    99+
    2022-06-04
    协议 教程 Swift
  • PHP 开发必备技能:Linux 上 HTTP 协议的应用。
    PHP 开发必备技能:Linux 上 HTTP 协议的应用 在现代互联网应用程序中,HTTP 协议是非常重要的一部分。PHP 开发者必须具备对 HTTP 协议的深刻理解,以便能够开发出高效、可靠的网络应用程序。本文将介绍一些在 Linux ...
    99+
    2023-09-18
    linux http 开发技术
  • PHP开发者必须知道的HTTP协议是什么?
    HTTP协议是互联网上最重要的协议之一,它是客户端和服务器之间通信的基础。对于PHP开发者来说,了解HTTP协议不仅可以让他们更好地理解Web开发,还可以帮助他们更好地设计和开发Web应用程序。 HTTP协议的基本概念 HTTP协议全称是...
    99+
    2023-06-30
    http 关键字 git
  • Java4Android开发教程(二)hello world!
    安装完jdk环境后,编写第一个java程序hello.java: 代码如下: public class hello{     public st...
    99+
    2022-06-06
    hello world JAVA android开发 教程 Android
  • PHP中的多线程和协程开发
    随着网络应用的不断发展和整个计算机应用的崛起,针对并发问题的解决方案也不断地发展和壮大。在使用PHP进行应用程序开发时,PHP中也提供了多线程和协程的开发方式来帮助程序员解决并发处理问题,本文将介绍PHP中的多线程和协程开发。一、PHP多线...
    99+
    2023-05-24
    PHP 多线程 协程。
  • Linux 上的 PHP 开发技术,HTTP 协议你了解多少?
    PHP 是一种广泛使用的服务器端脚本语言,常用于 Web 开发。在 Linux 上,PHP 是最流行的 Web 开发语言之一。本文将介绍 Linux 上的 PHP 开发技术以及 HTTP 协议的基本知识。 一、安装 PHP 在 Linux...
    99+
    2023-09-18
    linux http 开发技术
  • HTTP 协议在 PHP 开发中的应用,Linux 你熟悉吗?
    随着互联网的发展,HTTP 协议成为了互联网上最为常见的协议。在 PHP 开发中,我们经常需要使用 HTTP 协议来进行网络通信和数据传输。同时,Linux 也是 PHP 开发中常用的操作系统,其命令行操作和工具在 PHP 开发中也起到了...
    99+
    2023-09-18
    linux http 开发技术
  • PHP使用SMTP协议发送邮件的完整流程
    随着互联网的发展,电子邮件已经成为人们日常沟通的重要手段之一。在Web应用程序中,发送邮件已经成为了必须的功能之一,而且随着Web应用的发展,邮件发送的方式也得到了很大的改进。其中,基于SMTP协议的邮件发送方式,成为了Web应用中最常用的...
    99+
    2023-05-23
    PHP 邮件发送 SMTP
  • Taro小程序隐私协议开发指南填坑
    一. 配置文件app.config.js export default { ... __usePrivacyCheck__: true, ...} 二. 开发者工具基础库修改 原因:...
    99+
    2023-10-01
    taro 小程序
  • PHP Websocket开发教程,构建实时团队协作功能
    PHP Websocket开发教程,构建实时团队协作功能前言:随着互联网技术的迅猛发展,越来越多的Web应用程序需要实时通信来实现实时数据更新和实时团队协作等功能。这时候Websocket技术就显得尤为重要,而PHP作为广泛应用于Web开发...
    99+
    2023-12-09
    PHP websocket 实时协作
  • 你了解Java教程中的HTTP协议吗?
    Java作为一种高级编程语言,广泛应用于各种应用程序的开发。而HTTP协议则是Java教程中必不可少的一部分。本文将介绍HTTP协议在Java教程中的应用,并为读者演示HTTP协议相关的代码。 HTTP协议是一种网络协议,它负责在Web服务...
    99+
    2023-06-17
    教程 http 自然语言处理
  • Android二维码开发学习教程
    二维码其实有很多种,但是我们常见的微信使用的是一种叫做QRCode的二维码,像下面这样的,可以放心的扫,这只是我的博客主页链接啦:   关于QR码编码的二维码,我们...
    99+
    2022-06-06
    开发学习 学习 教程 Android
  • 如何理解WEB开发中的Python WSGI协议
    今天就跟大家聊聊有关如何理解WEB开发中的Python WSGI协议,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Web应用程序开发Web应用程序的本质是什么简单描述Web应用程序的...
    99+
    2023-06-02
  • PHP教程:如何在分布式Git环境中协作开发?
    在当今的互联网时代,越来越多的开发者选择使用Git来管理他们的代码库。Git具有分布式的特点,使得团队协作开发变得更加方便快捷。在本文中,我们将介绍如何在分布式Git环境中进行协作开发。 一、创建一个Git仓库 首先,我们需要创建一个Gi...
    99+
    2023-09-11
    教程 分布式 git
  • PHP异步协程开发:构建高可用的在线教育平台
    PHP异步协程开发:构建高可用的在线教育平台概述:随着互联网的迅猛发展和全球疫情的影响,在线教育平台成为教育行业的重要组成部分。为了提供高效稳定的服务,以及应对大量并发请求,采用异步协程开发成为一个不可或缺的选择。本文就如何使用PHP异步协...
    99+
    2023-12-09
    在线教育 高可用 异步协程
  • Android如何开发MQTT协议的模型及通信
    本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何开发MQTT协议的模型及通信”吧!什么是MQTT协议MQTT协议又...
    99+
    2023-07-05
  • ASP开发技术和HTTP协议的完美结合
    ASP (Active Server Pages) 是一种基于服务器端的脚本语言,可以用来创建动态的网页和 Web 应用程序。而 HTTP (Hypertext Transfer Protocol) 协议则是 Web 上数据交换的基础协议...
    99+
    2023-10-22
    开发技术 ide http
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作