为什么协议缓冲区生成的PHP类在使用嵌套消息时包含hasField()和clearField()函数?

为什么协议缓冲区生成的PHP类在使用嵌套消息时包含hasField()和clearField()函数?,php,protocol-buffers,proto3,Php,Protocol Buffers,Proto3,考虑以下.proto代码: message EnumerateResponse { ApiDomains api_domains = 1; string action = 2; int32 reference_timestamp = 3; } message ApiDomains { string api_root_url = 1; string api_service_url = 2; } 编译此原型文件时,为EnumerateResponse生成的PHP类将包含消息中

考虑以下.proto代码:

message EnumerateResponse {
  ApiDomains api_domains = 1;
  string action = 2;
  int32 reference_timestamp = 3;
}

message ApiDomains {
  string api_root_url = 1;
  string api_service_url = 2;
}
编译此原型文件时,为EnumerateResponse生成的PHP类将包含消息中每个字段的标准getField和setField函数,但它还包含仅存在于嵌套ApiDomains消息中的hasField和clearField方法:

    /**
     * Generated from protobuf field <code>.AccountServiceProtoLayer.Resource.V1.ApiDomains api_domains = 1;</code>
     * @return \AccountServiceProtoLayer\Resource\V1\ApiDomains|null
     */
    public function getApiDomains()
    {
        return isset($this->api_domains) ? $this->api_domains : null;
    }

    public function hasApiDomains()
    {
        return isset($this->api_domains);
    }

    public function clearApiDomains()
    {
        unset($this->api_domains);
    }
如果消息不包含嵌套方法,则永远不会创建这些方法

我试图跟踪函数调用堆栈以查看这些方法在何处以及如何使用,但这使我在供应商文件中陷入了一个永无止境的陷阱。我还搜索了文档,在Python参考中看到了对hasField和clearField的引用,但在PHP生成的代码参考中没有提及。两种语言的引用都没有提到这与嵌套消息的关系

有人知道为什么会生成这些存根吗?看起来它不会给我的代码库带来未来的问题,但是我不知道它的用途或者它存在的原因,我感到不舒服