Removed compatibility code for PHP <8.0 (#13325)

Now that we have dropped support for old PHP, we can remove this compatibility layer, which will simplify the code.

This PR supersedes https://github.com/protocolbuffers/protobuf/pull/13289. I had to move the PR to be based on a branch of this repo, since it modifies workflow files.

Closes #13325

COPYBARA_INTEGRATE_REVIEW=https://github.com/protocolbuffers/protobuf/pull/13325 from protocolbuffers:rm-php-compat-code 89a4ba7eab
PiperOrigin-RevId: 558905550
pull/13620/head
Joshua Haberman 2 years ago committed by Copybara-Service
parent 03108a63d5
commit f881c8fe15
  1. 2
      .github/workflows/test_php.yml
  2. 30
      php/ext/google/protobuf/array.c
  3. 2
      php/ext/google/protobuf/convert.c
  4. 26
      php/ext/google/protobuf/map.c
  5. 52
      php/ext/google/protobuf/message.c
  6. 2
      php/ext/google/protobuf/names.c
  7. 8
      php/ext/google/protobuf/protobuf.c
  8. 96
      php/ext/google/protobuf/protobuf.h
  9. 10
      php/tests/PreviouslyGeneratedClassTest.php

@ -138,7 +138,7 @@ jobs:
- name: Run tests
uses: protocolbuffers/protobuf-ci/docker@v2
with:
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/php-aarch64:0cc100b6e03d14c1e8f71ae794dc162ed122fe31@sha256:77b70feba68dced1f0fd21b52a08d3d2e0c5c797bfe68435a0038ce87ecfd310
image: us-docker.pkg.dev/protobuf-build/containers/test/linux/php-aarch64@sha256:77ff9fdec867bbfb290ee0b10d8b7a3e5e434155daa5ec93de7341c7592b858d
platform: linux/arm64
skip-staleness-check: true
credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}

@ -118,8 +118,8 @@ static int RepeatedField_compare_objects(zval* rf1, zval* rf2) {
*
* $rf2 = clone $rf1;
*/
static zend_object* RepeatedField_clone_obj(PROTO_VAL* object) {
RepeatedField* intern = PROTO_VAL_P(object);
static zend_object* RepeatedField_clone_obj(zend_object* object) {
RepeatedField* intern = (RepeatedField*)object;
upb_Arena* arena = Arena_Get(&intern->arena);
upb_Array* clone = upb_Array_New(arena, intern->type.type);
size_t n = upb_Array_Size(intern->array);
@ -135,12 +135,12 @@ static zend_object* RepeatedField_clone_obj(PROTO_VAL* object) {
return Z_OBJ_P(&ret);
}
static HashTable* RepeatedField_GetProperties(PROTO_VAL* object) {
static HashTable* RepeatedField_GetProperties(zend_object* object) {
return NULL; // We do not have a properties table.
}
static zval* RepeatedField_GetPropertyPtrPtr(PROTO_VAL* object,
PROTO_STR* member, int type,
static zval* RepeatedField_GetPropertyPtrPtr(zend_object* object,
zend_string* member, int type,
void** cache_slot) {
return NULL; // We don't offer direct references to our properties.
}
@ -459,7 +459,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_append, 0, 0, 1)
ZEND_ARG_INFO(0, newval)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetExists, 0, 0, _IS_BOOL, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetExists, 0, 0, _IS_BOOL, 0)
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()
@ -467,16 +467,16 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_offsetGet, 0, 0, IS_MI
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetSet, 0, 2, IS_VOID, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetSet, 0, 2, IS_VOID, 0)
ZEND_ARG_INFO(0, index)
ZEND_ARG_INFO(0, newval)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetUnset, 0, 0, IS_VOID, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetUnset, 0, 0, IS_VOID, 0)
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_count, 0, 0, IS_LONG, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_count, 0, 0, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_getIterator, 0, 0, Traversable, 0)
@ -628,6 +628,7 @@ PHP_METHOD(RepeatedFieldIter, valid) {
RETURN_BOOL(intern->position < upb_Array_Size(field->array));
}
// clang-format: off
ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_current, 0, 0,
IS_MIXED, 0)
ZEND_END_ARG_INFO()
@ -636,13 +637,13 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_key, 0, 0, IS_MIXED,
0)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_next, 0, 0, IS_VOID, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_next, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_valid, 0, 0, _IS_BOOL, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_valid, 0, 0, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rewind, 0, 0, IS_VOID, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rewind, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
static zend_function_entry repeated_field_iter_methods[] = {
@ -652,6 +653,7 @@ static zend_function_entry repeated_field_iter_methods[] = {
RepeatedFieldIter, next, arginfo_next, ZEND_ACC_PUBLIC)
PHP_ME(RepeatedFieldIter, valid, arginfo_valid, ZEND_ACC_PUBLIC)
ZEND_FE_END};
// clang-format: on
// -----------------------------------------------------------------------------
// Module init.
@ -679,11 +681,7 @@ void Array_ModuleInit() {
h = &RepeatedField_object_handlers;
memcpy(h, &std_object_handlers, sizeof(zend_object_handlers));
h->dtor_obj = RepeatedField_destructor;
#if PHP_VERSION_ID < 80000
h->compare_objects = RepeatedField_compare_objects;
#else
h->compare = RepeatedField_compare_objects;
#endif
h->clone_obj = RepeatedField_clone_obj;
h->get_properties = RepeatedField_GetProperties;
h->get_property_ptr_ptr = RepeatedField_GetPropertyPtrPtr;

@ -506,7 +506,7 @@ bool Convert_PhpToUpbAutoWrap(zval* val, upb_MessageValue* upb_val,
// Assigning a scalar to a wrapper-typed value. We will automatically wrap
// the value, so the user doesn't need to create a FooWrapper(['value': X])
// message manually.
upb_MiniTable* t = upb_MessageDef_MiniTable(subm);
const upb_MiniTable* t = upb_MessageDef_MiniTable(subm);
upb_Message* wrapper = upb_Message_New(t, arena);
const upb_FieldDef* val_f = upb_MessageDef_FindFieldByNumber(subm, 1);
upb_MessageValue msgval;

@ -133,8 +133,8 @@ static int MapField_compare_objects(zval* map1, zval* map2) {
*
* $map2 = clone $map1;
*/
static zend_object* MapField_clone_obj(PROTO_VAL* object) {
MapField* intern = PROTO_VAL_P(object);
static zend_object* MapField_clone_obj(zend_object* object) {
MapField* intern = (MapField*)object;
upb_Arena* arena = Arena_Get(&intern->arena);
upb_Map* clone =
upb_Map_New(arena, intern->type.key_type, intern->type.val_type.type);
@ -151,12 +151,12 @@ static zend_object* MapField_clone_obj(PROTO_VAL* object) {
return Z_OBJ_P(&ret);
}
static zval* Map_GetPropertyPtrPtr(PROTO_VAL* object, PROTO_STR* member,
static zval* Map_GetPropertyPtrPtr(zend_object* object, zend_string* member,
int type, void** cache_slot) {
return NULL; // We don't offer direct references to our properties.
}
static HashTable* Map_GetProperties(PROTO_VAL* object) {
static HashTable* Map_GetProperties(zend_object* object) {
return NULL; // We do not have a properties table.
}
@ -458,23 +458,23 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_offsetGet, 0, 0, IS_MI
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetSet, 0, 2, IS_VOID, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetSet, 0, 2, IS_VOID, 0)
ZEND_ARG_INFO(0, index)
ZEND_ARG_INFO(0, newval)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetUnset, 0, 0, IS_VOID, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetUnset, 0, 0, IS_VOID, 0)
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetExists, 0, 0, _IS_BOOL, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_offsetExists, 0, 0, _IS_BOOL, 0)
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_getIterator, 0, 0, Traversable, 0)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_count, 0, 0, IS_LONG, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_count, 0, 0, IS_LONG, 0)
ZEND_END_ARG_INFO()
static zend_function_entry MapField_methods[] = {
@ -627,7 +627,7 @@ PHP_METHOD(MapFieldIter, valid) {
}
// clang-format off
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rewind, 0, 0, IS_VOID, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rewind, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_current, 0, 0, IS_MIXED, 0)
@ -636,10 +636,10 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_key, 0, 0, IS_MIXED, 0)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_next, 0, 0, IS_VOID, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_next, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO()
PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_valid, 0, 0, _IS_BOOL, 0)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_valid, 0, 0, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
static zend_function_entry map_field_iter_methods[] = {
@ -678,11 +678,7 @@ void Map_ModuleInit() {
h = &MapField_object_handlers;
memcpy(h, &std_object_handlers, sizeof(zend_object_handlers));
h->dtor_obj = MapField_destructor;
#if PHP_VERSION_ID < 80000
h->compare_objects = MapField_compare_objects;
#else
h->compare = MapField_compare_objects;
#endif
h->clone_obj = MapField_clone_obj;
h->get_properties = Map_GetProperties;
h->get_property_ptr_ptr = Map_GetPropertyPtrPtr;

@ -110,10 +110,10 @@ static void Message_dtor(zend_object* obj) {
*
* Helper function to look up a field given a member name (as a string).
*/
static const upb_FieldDef* get_field(Message* msg, PROTO_STR* member) {
static const upb_FieldDef* get_field(Message* msg, zend_string* member) {
const upb_MessageDef* m = msg->desc->msgdef;
const upb_FieldDef* f = upb_MessageDef_FindFieldByNameWithSize(
m, PROTO_STRVAL_P(member), PROTO_STRLEN_P(member));
m, ZSTR_VAL(member), ZSTR_LEN(member));
if (!f) {
zend_throw_exception_ex(NULL, 0, "No such property %s.",
@ -287,9 +287,9 @@ static int Message_compare_objects(zval* m1, zval* m2) {
* return isset($this->optional_int32);
* }
*/
static int Message_has_property(PROTO_VAL* obj, PROTO_STR* member,
static int Message_has_property(zend_object* obj, zend_string* member,
int has_set_exists, void** cache_slot) {
Message* intern = PROTO_VAL_P(obj);
Message* intern = (Message*)obj;
const upb_FieldDef* f = get_field(intern, member);
if (!f) return 0;
@ -321,9 +321,9 @@ static int Message_has_property(PROTO_VAL* obj, PROTO_STR* member,
* unset($this->optional_int32);
* }
*/
static void Message_unset_property(PROTO_VAL* obj, PROTO_STR* member,
static void Message_unset_property(zend_object* obj, zend_string* member,
void** cache_slot) {
Message* intern = PROTO_VAL_P(obj);
Message* intern = (Message*)obj;
const upb_FieldDef* f = get_field(intern, member);
if (!f) return;
@ -357,9 +357,9 @@ static void Message_unset_property(PROTO_VAL* obj, PROTO_STR* member,
* We lookup the field and return the scalar, RepeatedField, or MapField for
* this field.
*/
static zval* Message_read_property(PROTO_VAL* obj, PROTO_STR* member, int type,
void** cache_slot, zval* rv) {
Message* intern = PROTO_VAL_P(obj);
static zval* Message_read_property(zend_object* obj, zend_string* member,
int type, void** cache_slot, zval* rv) {
Message* intern = (Message*)obj;
const upb_FieldDef* f = get_field(intern, member);
if (!f) return &EG(uninitialized_zval);
@ -388,24 +388,15 @@ static zval* Message_read_property(PROTO_VAL* obj, PROTO_STR* member, int type,
* The C extension version of checkInt32() doesn't actually check anything, so
* we perform all checking and conversion in this function.
*/
static PROTO_RETURN_VAL Message_write_property(PROTO_VAL* obj,
PROTO_STR* member, zval* val,
void** cache_slot) {
Message* intern = PROTO_VAL_P(obj);
static zval* Message_write_property(zend_object* obj, zend_string* member,
zval* val, void** cache_slot) {
Message* intern = (Message*)obj;
const upb_FieldDef* f = get_field(intern, member);
if (f && Message_set(intern, f, val)) {
#if PHP_VERSION_ID < 70400
return;
#else
return val;
#endif
} else {
#if PHP_VERSION_ID < 70400
return;
#else
return &EG(error_zval);
#endif
}
}
@ -416,8 +407,9 @@ static PROTO_RETURN_VAL Message_write_property(PROTO_VAL* obj,
* reference to our internal properties. We don't support this, so we return
* NULL.
*/
static zval* Message_get_property_ptr_ptr(PROTO_VAL* object, PROTO_STR* member,
int type, void** cache_slot) {
static zval* Message_get_property_ptr_ptr(zend_object* object,
zend_string* member, int type,
void** cache_slot) {
return NULL; // We do not have a properties table.
}
@ -428,9 +420,9 @@ static zval* Message_get_property_ptr_ptr(PROTO_VAL* object, PROTO_STR* member,
*
* $msg2 = clone $msg;
*/
static zend_object* Message_clone_obj(PROTO_VAL* object) {
Message* intern = PROTO_VAL_P(object);
upb_MiniTable* t = upb_MessageDef_MiniTable(intern->desc->msgdef);
static zend_object* Message_clone_obj(zend_object* object) {
Message* intern = (Message*)object;
const upb_MiniTable* t = upb_MessageDef_MiniTable(intern->desc->msgdef);
upb_Message* clone = upb_Message_New(t, Arena_Get(&intern->arena));
// TODO: copy unknown fields?
@ -447,7 +439,7 @@ static zend_object* Message_clone_obj(PROTO_VAL* object) {
* Object handler for the get_properties event in PHP. This returns a HashTable
* of our internal properties. We don't support this, so we return NULL.
*/
static HashTable* Message_get_properties(PROTO_VAL* object) {
static HashTable* Message_get_properties(zend_object* object) {
return NULL; // We don't offer direct references to our properties.
}
@ -584,7 +576,7 @@ bool Message_InitFromPhp(upb_Message* msg, const upb_MessageDef* m, zval* init,
static void Message_Initialize(Message* intern, const Descriptor* desc) {
intern->desc = desc;
upb_MiniTable* t = upb_MessageDef_MiniTable(desc->msgdef);
const upb_MiniTable* t = upb_MessageDef_MiniTable(desc->msgdef);
intern->msg = upb_Message_New(t, Arena_Get(&intern->arena));
ObjCache_Add(intern->msg, &intern->std);
}
@ -1434,11 +1426,7 @@ void Message_ModuleInit() {
memcpy(h, &std_object_handlers, sizeof(zend_object_handlers));
h->dtor_obj = Message_dtor;
#if PHP_VERSION_ID < 80000
h->compare_objects = Message_compare_objects;
#else
h->compare = Message_compare_objects;
#endif
h->read_property = Message_read_property;
h->write_property = Message_write_property;
h->has_property = Message_has_property;

@ -126,7 +126,7 @@ static char nolocale_toupper(char ch) {
}
}
static char* strdup_nolocale_lower(char* str, int length) {
static char* strdup_nolocale_lower(const char* str, int length) {
char* lower = malloc(length + 1);
lower[length] = '\0';
for (int i = 0; i < length; ++i) {

@ -265,18 +265,10 @@ const upb_MessageDef* NameMap_GetMessage(zend_class_entry* ce) {
zend_hash_find_ptr(&PROTOBUF_G(name_msg_cache), ce->name);
if (!ret && ce->create_object && ce != PROTOBUF_G(constructing_class)) {
#if PHP_VERSION_ID < 80000
zval tmp;
zval zv;
ZVAL_OBJ(&tmp, ce->create_object(ce));
zend_call_method_with_0_params(&tmp, ce, NULL, "__construct", &zv);
zval_ptr_dtor(&tmp);
#else
zval zv;
zend_object* tmp = ce->create_object(ce);
zend_call_method_with_0_params(tmp, ce, NULL, "__construct", &zv);
OBJ_RELEASE(tmp);
#endif
zval_ptr_dtor(&zv);
ret = zend_hash_find_ptr(&PROTOBUF_G(name_msg_cache), ce->name);
}

@ -38,86 +38,6 @@
upb_DefPool* get_global_symtab();
#if PHP_VERSION_ID < 70300
#define GC_ADDREF(h) ++GC_REFCOUNT(h)
#define GC_DELREF(h) --GC_REFCOUNT(h)
#endif
// Since php 7.4, the write_property() object handler now returns the assigned
// value (after possible type coercions) rather than void.
// https://github.com/php/php-src/blob/PHP-7.4.0/UPGRADING.INTERNALS#L171-L173
#if PHP_VERSION_ID < 70400
#define PROTO_RETURN_VAL void
#else
#define PROTO_RETURN_VAL zval*
#endif
// Since php 8.0, the Object Handlers API was changed to receive zend_object*
// instead of zval* and zend_string* instead of zval* for property names.
// https://github.com/php/php-src/blob/php-8.0.0beta1/UPGRADING.INTERNALS#L37-L39
#if PHP_VERSION_ID < 80000
#define PROTO_VAL zval
#define PROTO_STR zval
#define PROTO_VAL_P(obj) (void*)Z_OBJ_P(obj)
#define PROTO_STRVAL_P(obj) Z_STRVAL_P(obj)
#define PROTO_STRLEN_P(obj) Z_STRLEN_P(obj)
#define ZVAL_OBJ_COPY(z, o) \
do { \
ZVAL_OBJ(z, o); \
GC_ADDREF(o); \
} while (0)
#define RETVAL_OBJ_COPY(r) ZVAL_OBJ_COPY(return_value, r)
#define RETURN_OBJ_COPY(r) \
do { \
RETVAL_OBJ_COPY(r); \
return; \
} while (0)
#define RETURN_COPY(zv) \
do { \
ZVAL_COPY(return_value, zv); \
return; \
} while (0)
#define RETURN_COPY_VALUE(zv) \
do { \
ZVAL_COPY_VALUE(return_value, zv); \
return; \
} while (0)
#else
#define PROTO_VAL zend_object
#define PROTO_STR zend_string
#define PROTO_VAL_P(obj) (void*)(obj)
#define PROTO_STRVAL_P(obj) ZSTR_VAL(obj)
#define PROTO_STRLEN_P(obj) ZSTR_LEN(obj)
#endif
// In PHP 8.1, several old interfaces are removed:
// https://github.com/php/php-src/blob/14f599ea7def7c7a59c40aff763ce8b105573e7a/UPGRADING.INTERNALS#L27-L31
//
// We now use the new interfaces (zend_ce_arrayaccess and zend_ce_countable).
// However we have to polyfill zend_ce_countable, which was only introduced in
// PHP 7.2.0.
#if PHP_VERSION_ID < 70200
#define zend_ce_countable spl_ce_Countable
#define ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX( \
name, return_reference, required_num_args, class_name, allow_null) \
ZEND_BEGIN_ARG_INFO_EX(name, return_reference, required_num_args, allow_null)
#endif
// polyfill for ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX, which changes
// between 7.1 and 7.2
#if PHP_VERSION_ID < 70200
#define PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( \
name, return_reference, required_num_args, type, allow_null) \
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, \
required_num_args, type, \
/*class_name*/ 0, allow_null)
#else
#define PROTOBUF_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( \
name, return_reference, required_num_args, type, allow_null) \
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, \
required_num_args, type, allow_null)
#endif
// In PHP 8.1, mismatched tentative return types emit a deprecation notice.
// https://wiki.php.net/rfc/internal_method_return_types
//
@ -128,22 +48,6 @@ upb_DefPool* get_global_symtab();
ZEND_BEGIN_ARG_INFO_EX(name, return_reference, required_num_args, allow_null)
#endif
#ifndef IS_VOID
#define IS_VOID 99
#endif
#ifndef IS_MIXED
#define IS_MIXED 99
#endif
#ifndef _IS_BOOL
#define _IS_BOOL 99
#endif
#ifndef IS_LONG
#define IS_LONG 99
#endif
ZEND_BEGIN_ARG_INFO(arginfo_void, 0)
ZEND_END_ARG_INFO()

@ -11,8 +11,14 @@ class PreviouslyGeneratedClassTest extends TestBase
public function testPrefixForReservedWords()
{
$m = new \Previous\readonly();
// In newer versions of PHP, we cannot reference the old class name.
if (version_compare(phpversion(), '8.1.0', '>=')) return;
$this->assertTrue(true);
// For older versions of PHP, verify that we can reference the
// original class name.
eval('
$m = new \Previous\readonly();
$this->assertTrue(true);
');
}
}

Loading…
Cancel
Save