>  기사  >  백엔드 개발  >  프로토콜 버퍼 - 프로토콜 버퍼 확장을 php7로 업그레이드할 때 문제가 발생합니까?

프로토콜 버퍼 - 프로토콜 버퍼 확장을 php7로 업그레이드할 때 문제가 발생합니까?

WBOY
WBOY원래의
2016-09-08 08:43:551028검색

배경

프로젝트에서 프로토콜버퍼를 사용하고 있기 때문에 프로젝트 전체에서 사용하는 확장은 기본적으로 php7을 지원합니다. 프로토콜버퍼만 php7을 지원하지 않습니다. 원저자는 확장 유지를 중단하고 어떻게 할지 연구를 시작할 수밖에 없습니다. 프로토콜 버퍼 확장 버전 5.x를 php7로 업그레이드했습니다. 확장은 현재 컴파일됩니다. 깃허브

make 테스트 결과는 다음과 같습니다.

<code>Number of tests :  144               144
Tests skipped   :    0 (  0.0%) --------
Tests warned    :    0 (  0.0%) (  0.0%)
Tests failed    :   67 ( 46.5%) ( 46.5%)
Expected fail   :    0 (  0.0%) (  0.0%)
Tests passed    :   77 ( 53.5%) ( 53.5%)</code>

발생한 문제

테스트 코드는 다음과 같습니다.

<code><?php
require dirname(__FILE__) . DIRECTORY_SEPARATOR . "messages" . DIRECTORY_SEPARATOR . "field_int32.proto.php";

$bytes = file_get_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . "fixtures" . DIRECTORY_SEPARATOR . "001_int32_init.bin");

$u = new Tutorial_Integer32();
$u->setValue(0);

$obj = ProtocolBuffers::decode("Tutorial_Integer32", $bytes);
var_dump($obj);
if ($obj instanceof Tutorial_Integer32) {
    var_dump($obj->getValue());
    if ($obj->getValue() == 0) {
        echo "OK" . PHP_EOL;
    } else {
        var_dump($obj);
    }
} else {
    var_dump($obj);
}

ini_set("protocolbuffers.native_scalars", 1);
$obj = ProtocolBuffers::decode("Tutorial_Integer32", $bytes);

if ($obj instanceof Tutorial_Integer32) {
    var_dump($obj->getValue());
    if ($obj->getValue() === 0) {
        echo "OK" . PHP_EOL;
    } else {
        var_dump($obj);
    }
} else {
    var_dump($obj);
}

</code>

출력 결과는 다음과 같습니다.

<code>object(Tutorial_Integer32)#2 (2) {
  ["_properties":protected]=>
  array(0) {
  }
  ["value":protected]=>
  string(1) "0"
}
NULL
OK
NULL
object(Tutorial_Integer32)#3 (2) {
  ["_properties":protected]=>
  array(0) {
  }
  ["value":protected]=>
  int(0)
}</code>

문제 요약: 프로토콜 버퍼::디코드 시 구문 분석된 개체를 반환할 수 있지만 개체의 속성을 읽을 수 없습니다. 해결. . .

답글 내용:

배경

프로젝트에서 프로토콜버퍼를 사용하고 있기 때문에 프로젝트 전체에서 사용하는 확장은 기본적으로 php7을 지원합니다. 프로토콜버퍼만 php7을 지원하지 않습니다. 원저자는 확장 유지를 중단하고 어떻게 할지 연구를 시작할 수밖에 없습니다. 프로토콜 버퍼 확장 버전 5.x를 php7로 업그레이드했습니다. 확장은 현재 컴파일됩니다. 깃허브

make 테스트 결과는 다음과 같습니다.

<code>Number of tests :  144               144
Tests skipped   :    0 (  0.0%) --------
Tests warned    :    0 (  0.0%) (  0.0%)
Tests failed    :   67 ( 46.5%) ( 46.5%)
Expected fail   :    0 (  0.0%) (  0.0%)
Tests passed    :   77 ( 53.5%) ( 53.5%)</code>

발생한 문제

테스트 코드는 다음과 같습니다.

<code><?php
require dirname(__FILE__) . DIRECTORY_SEPARATOR . "messages" . DIRECTORY_SEPARATOR . "field_int32.proto.php";

$bytes = file_get_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . "fixtures" . DIRECTORY_SEPARATOR . "001_int32_init.bin");

$u = new Tutorial_Integer32();
$u->setValue(0);

$obj = ProtocolBuffers::decode("Tutorial_Integer32", $bytes);
var_dump($obj);
if ($obj instanceof Tutorial_Integer32) {
    var_dump($obj->getValue());
    if ($obj->getValue() == 0) {
        echo "OK" . PHP_EOL;
    } else {
        var_dump($obj);
    }
} else {
    var_dump($obj);
}

ini_set("protocolbuffers.native_scalars", 1);
$obj = ProtocolBuffers::decode("Tutorial_Integer32", $bytes);

if ($obj instanceof Tutorial_Integer32) {
    var_dump($obj->getValue());
    if ($obj->getValue() === 0) {
        echo "OK" . PHP_EOL;
    } else {
        var_dump($obj);
    }
} else {
    var_dump($obj);
}

</code>

출력 결과는 다음과 같습니다.

<code>object(Tutorial_Integer32)#2 (2) {
  ["_properties":protected]=>
  array(0) {
  }
  ["value":protected]=>
  string(1) "0"
}
NULL
OK
NULL
object(Tutorial_Integer32)#3 (2) {
  ["_properties":protected]=>
  array(0) {
  }
  ["value":protected]=>
  int(0)
}</code>

문제 요약: 프로토콜 버퍼::디코드 시 구문 분석된 개체를 반환할 수 있지만 개체의 속성을 읽을 수 없습니다. 해결. . .

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.