com php-src: ReflectionClass::newInstanceWithoutConstructor() should be allowed to instantiate every class except those internal classes with a final
__construct(): ext/reflection/php_reflectio n.c ext/reflection/tests/ReflectionClass_newInstanceWitho utConstructor.phpt ext/reflection/tests/bug64007
.phpt
| From: | Ferenc Kovacs | Date: | Wed, 30 Jul 2014 08:08:56 +0000 |
| Subject: | com php-src: ReflectionClass::newInstanceWithoutConstructor() should be allowed to instantiate every class except those internal classes with a final __construct(): ext/reflection/php_reflectio n.c ext/reflection/tests/ReflectionClass_newInstanceWitho utConstructor.phpt ext/reflection/tests/bug64007 .phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-79653@lists.php.net to get a copy of this message | ||
Commit: d586441d902ebabf2300b6724a2217e07bb12803
Author: Ferenc Kovacs <tyrael@php.net> Wed, 23 Jul 2014 07:45:02 +0200
Parents: 43e956a9a1b72dda31f24f1fc9804e19f3391dd4
Branches: PHP-5.6
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=d586441d902ebabf2300b6724a2217e07bb12803
Log:
ReflectionClass::newInstanceWithoutConstructor() should be allowed to instantiate every class except
those internal classes with a final __construct()
Changed paths:
M ext/reflection/php_reflection.c
M ext/reflection/tests/ReflectionClass_newInstanceWithoutConstructor.phpt
M ext/reflection/tests/bug64007.phpt
Diff:
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 02a19c0..8ccd5e6 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -4308,8 +4308,8 @@ ZEND_METHOD(reflection_class, newInstanceWithoutConstructor)
METHOD_NOTSTATIC(reflection_class_ptr);
GET_REFLECTION_OBJECT_PTR(ce);
- if (ce->create_object != NULL) {
- zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Class %s is an internal
class that cannot be instantiated without invoking its constructor", ce->name);
+ if (ce->create_object != NULL && ce->ce_flags & ZEND_ACC_FINAL_CLASS) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Class %s is an internal
class with a final __construct thus cannot be instantiated without invoking its constructor",
ce->name);
}
object_init_ex(return_value, ce);
diff --git a/ext/reflection/tests/ReflectionClass_newInstanceWithoutConstructor.phpt
b/ext/reflection/tests/ReflectionClass_newInstanceWithoutConstructor.phpt
index 1932dbf..580c573 100644
--- a/ext/reflection/tests/ReflectionClass_newInstanceWithoutConstructor.phpt
+++ b/ext/reflection/tests/ReflectionClass_newInstanceWithoutConstructor..phpt
@@ -20,13 +20,18 @@ var_dump($class->newInstanceWithoutConstructor());
$class = new ReflectionClass('DateTime');
var_dump($class->newInstanceWithoutConstructor());
+
+$class = new ReflectionClass('Generator');
+var_dump($class->newInstanceWithoutConstructor());
--EXPECTF--
object(Foo)#%d (0) {
}
object(stdClass)#%d (0) {
}
+object(DateTime)#%d (0) {
+}
-Fatal error: Uncaught exception 'ReflectionException' with message 'Class DateTime
is an internal class that cannot be instantiated without invoking its constructor' in
%sReflectionClass_newInstanceWithoutConstructor.php:%d
+Fatal error: Uncaught exception 'ReflectionException' with message 'Class Generator
is an internal class with a final __construct thus cannot be instantiated without invoking its
constructor' in %sReflectionClass_newInstanceWithoutConstructor.php:%d
Stack trace:
#0 %sReflectionClass_newInstanceWithoutConstructor.php(%d):
ReflectionClass->newInstanceWithoutConstructor()
#1 {main}
diff --git a/ext/reflection/tests/bug64007.phpt b/ext/reflection/tests/bug64007.phpt
index 32ec6a5..df86093 100644
--- a/ext/reflection/tests/bug64007.phpt
+++ b/ext/reflection/tests/bug64007.phpt
@@ -14,6 +14,6 @@ $generator = $reflection->newInstance();
var_dump($generator);
?>
--EXPECTF--
-string(97) "Class Generator is an internal class that cannot be instantiated without invoking
its constructor"
+string(%d) "Class Generator is an internal class with a final __construct thus cannot be
instantiated without invoking its constructor"
Catchable fatal error: The "Generator" class is reserved for internal use and cannot be
manually instantiated in %sbug64007..php on line %d