There are some changes that are not included in this release but are planned for the near future:
Preserve unknown fields in proto3: please read this doc for the timeline and follow up this github issue for discussion.
Make C++ implementation C++11 only: we plan to require C++11 to build protobuf code starting from 3.4.0 or 3.5.0 release. Please join this github issue to provide your feedback.
Fixed map fields serialization of DynamicMessage to correctly serialize both key and value regardless of their presence.
Parser now rejects field number 0 correctly.
New API Message::SpaceUsedLong() that’s equivalent to Message::SpaceUsed() but returns the value in size_t.
New flag always_print_enums_as_ints in JsonPrintOptions.
New flag preserve_proto_field_names in JsonPrintOptions. It will instruct the JSON printer to use the original field name declared in the .proto file instead of converting them to lowerCamelCase when printing JSON.
JsonPrintOptions.always_print_primtive_fields now works for oneof message fields.
Fixed a bug that doesn’t allow different fields to set the same json_name value.
Fixed a performance bug that causes excessive memory copy when printing large messages.
Various performance optimizations.
Map field setters eagerly validate inputs and throw NullPointerExceptions as appropriate.
Added ByteBuffer overloads to the generated parsing methods and the Parser interface.
proto3 enum's getNumber() method now throws on UNRECOGNIZED values.
Output of JsonFormat is now locale independent.
Added FindServiceByName() in the pure-Python DescriptorPool. This works only for descriptors added with DescriptorPool.Add(). Generated descriptor_pool does not support this yet.
Added a descriptor_pool parameter for parsing Any in text_format.Parse().
descriptor_pool.FindFileContainingSymbol() now is able to find nested extensions.
Extending empty  to repeated field now sets parent message presence.
Added file option php_class_prefix. The prefix will be prepended to all generated classes defined in the file.
When encoding, negative int32 values are sign-extended to int64.
Repeated/Map field setter accepts a regular PHP array. Type checking is done on the array elements.
encode/decode are renamed to serializeToString/mergeFromString.
Added mergeFrom, clear method on Message.
Fixed a bug that oneof accessor didn’t return the field name that is actually set.
C extension now works with php7.
This is the first GA release of PHP. We guarantee that old generated code can always work with new runtime and new generated code.
Fixed help for GPBTimestamp for dates before the epoch that contain fractional seconds.
Added GPBMessageDropUnknownFieldsRecursively() to remove unknowns from a message and any sub messages.
Addressed a threading race in extension registration/lookup.
Increased the max message parsing depth to 100 to match the other languages.
Removed some use of dispatch_once in favor of atomic compare/set since it needs to be heap based.
Fixes for new Xcode 8.3 warnings.
Fixed MapField.Values.CopyTo, which would throw an exception unnecessarily if provided exactly the right size of array to copy to.
Fixed enum JSON formatting when multiple names mapped to the same numeric value.
Added JSON formatting option to format enums as integers.
Modified RepeatedField to implement IReadOnlyList.
Introduced the start of custom option handling; it's not as pleasant as it might be, but the information is at least present. We expect to extend code generation to improve this in the future.
Introduced ByteString.FromStream and ByteString.FromStreamAsync to efficiently create a ByteString from a stream.
Added whole-message deprecation, which decorates the class with [Obsolete].
Fixed Message#to_h for messages with map fields.
Fixed memcpy() in binary gems to work for old glibc, without breaking the build for non-glibc libc’s like musl.
Added compatibility tests for version 3.0.0.
Added conformance tests.
Fixed serialization of extensions: we need to emit a value even if it is falsy (like the number 0).