为什么协议缓冲区生成的PHP类在使用嵌套消息时包含hasField()和clearField()函数?
考虑以下.proto代码:为什么协议缓冲区生成的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类将包含消息中
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生成的代码参考中没有提及。两种语言的引用都没有提到这与嵌套消息的关系
有人知道为什么会生成这些存根吗?看起来它不会给我的代码库带来未来的问题,但是我不知道它的用途或者它存在的原因,我感到不舒服