Fixed bug #75090
authorThomas Punt <tpunt@hotmail.co.uk>
Wed, 23 Aug 2017 22:35:18 +0000 (23:35 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 25 Aug 2017 20:02:19 +0000 (22:02 +0200)
NEWS
ext/intl/calendar/calendar_class.cpp
ext/intl/tests/bug75090.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index f0cdd2b8b12f788f49ce59ca032d4669960c2b17..edd4e29e54e209bb2df9af850b674a348eb446e7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,10 @@ PHP                                                                        NEWS
 - CURL:
   . Fixed bug #75093 (OpenSSL support not detected). (Remi)
 
+- Intl:
+  . Fixed bug #75090 (IntlGregorianCalendar doesn't have constants from parent
+    class). (tpunt)
+
 - PDO_OCI:
   . Fixed bug #74631 (PDO_PCO with PHP-FPM: OCI environment initialized
     before PHP-FPM sets it up). (Ingmar Runge)
index 4414a7a092befe8118105602b4ee02140c48b42e..94a2d5a19901cc884a22c89dd69de9e09ac2e5b3 100644 (file)
@@ -477,17 +477,6 @@ void calendar_register_IntlCalendar_class(void)
        Calendar_handlers.dtor_obj = Calendar_objects_dtor;
        Calendar_handlers.free_obj = Calendar_objects_free;
 
-       /* Create and register 'IntlGregorianCalendar' class. */
-       INIT_CLASS_ENTRY(ce, "IntlGregorianCalendar", GregorianCalendar_class_functions);
-       GregorianCalendar_ce_ptr = zend_register_internal_class_ex(&ce,
-               Calendar_ce_ptr);
-       if (!GregorianCalendar_ce_ptr) {
-               //can't happen know without bigger problems before
-               php_error_docref0(NULL, E_ERROR,
-                       "IntlGregorianCalendar: class registration has failed.");
-               return;
-       }
-
        /* Declare 'IntlCalendar' class constants */
 #define CALENDAR_DECL_LONG_CONST(name, val) \
        zend_declare_class_constant_long(Calendar_ce_ptr, name, sizeof(name) - 1, \
@@ -541,5 +530,16 @@ void calendar_register_IntlCalendar_class(void)
        CALENDAR_DECL_LONG_CONST("WALLTIME_LAST",                               UCAL_WALLTIME_LAST);
        CALENDAR_DECL_LONG_CONST("WALLTIME_NEXT_VALID",                 UCAL_WALLTIME_NEXT_VALID);
 #endif
+
+       /* Create and register 'IntlGregorianCalendar' class. */
+       INIT_CLASS_ENTRY(ce, "IntlGregorianCalendar", GregorianCalendar_class_functions);
+       GregorianCalendar_ce_ptr = zend_register_internal_class_ex(&ce,
+               Calendar_ce_ptr);
+       if (!GregorianCalendar_ce_ptr) {
+               //can't happen know without bigger problems before
+               php_error_docref0(NULL, E_ERROR,
+                       "IntlGregorianCalendar: class registration has failed.");
+               return;
+       }
 }
 /* }}} */
diff --git a/ext/intl/tests/bug75090.phpt b/ext/intl/tests/bug75090.phpt
new file mode 100644 (file)
index 0000000..ff5e0bd
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+Bug #75090 Constants of parent IntlCalendar class not inherited
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+--FILE--
+<?php
+class Foo extends IntlCalendar {}
+
+$fooRef = new ReflectionClass(Foo::class);
+$intlGregorianCalendarRef = new ReflectionClass(IntlGregorianCalendar::class);
+$intlCalendarRef = new ReflectionClass(IntlCalendar::class);
+
+var_dump(
+    count($fooRef->getConstants()) === count($intlCalendarRef->getConstants()),
+    count($intlGregorianCalendarRef->getConstants()) === count($intlCalendarRef->getConstants())
+);
+?>
+===DONE===
+--EXPECT--
+bool(true)
+bool(true)
+===DONE===