PHP protobuf错误 - 用于编码/解码的未定义方法

时间:2017-05-03 10:05:15

标签: php protocol-buffers

我正在尝试使用https://github.com/google/protobuf/tree/master/php在PHP中学习Protobuf。目前我遇到了错误。

我安装protobuf的步骤:

  • 使用命令:

    通过pecl安装protobuf
    sudo pecl install protobuf-3.2.0a1
    
  • 如下所示设置composer.json,然后运行sudo composer install

    {
        "require": {
            "google/protobuf": "^3.2"
        }
    }
    

以下是我的代码:

  • 原型文件:

    syntax = "proto3";
    
    message APIReq {
        string functionName = 1;
        string name = 2;
        int32 time = 3;
        string type = 4;
    }
    
  • 从.proto文件生成PHP类的命令:

    protoc --php_out=/var/www/html/ MsgFormat.proto
    

protoc命令导致两个文件,APIReq.php和GPBMetadata / MsgFormat.php

之后,我在生成的PHP文件中添加了require_once __DIR__ . '/vendor/autoload.php';require_once __DIR__ . '/GPBMetadata/MsgFormat.php';,因为当我运行php APIReq.php时,它提出了

    PHP Fatal error:  Class 'Google\Protobuf\Internal\Message' not found in /var/www/html/testing/APIReq.php on line 13

在我添加这些行后,错误消失了,所以我假设两行都修复了问题

  • 我的PHP文件(以下来自https://developers.google.com/protocol-buffers/docs/reference/php-generated的示例,消息部分):

    <?php
        require __DIR__ . '/vendor/autoload.php';
        include_once('APIReq.php');
    
        $param = new APIReq();
        $param2 = new APIReq();
        $param->setFunctionname('functionname');
        $param->setName('name');
        $param->setTime(123456);
        $param->setType('type');
        $dt = $param->encode();
        $param2->decode($dt);
    ?>
    

当我运行PHP代码时,它会返回错误消息:

PHP Fatal error:  Call to undefined method APIReq::encode()

我该如何解决这个问题?

编辑:尝试使用protobuf 3.3.0,结果相同。

1 个答案:

答案 0 :(得分:2)

编码&amp;我跟踪时,代码库中不存在解码。

此更改已在3.3.0中引入

//to encode message 
$data = $param->serializeToString();

//to decode message
$param2 = new APIReq();
$param2->mergeFromString($data);