Skip to content

Commit

Permalink
Close #55490.
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianbergmann committed Aug 26, 2011
1 parent fa09c70 commit a702406
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 1 deletion.
23 changes: 23 additions & 0 deletions ext/reflection/php_reflection.c
Original file line number Diff line number Diff line change
Expand Up @@ -4129,6 +4129,25 @@ ZEND_METHOD(reflection_class, newInstance)
}
/* }}} */

/* {{{ proto public stdclass ReflectionClass::newInstanceWithoutConstructor()
Returns an instance of this class without invoking its constructor */
ZEND_METHOD(reflection_class, newInstanceWithoutConstructor)
{
zval *retval_ptr = NULL;
reflection_object *intern;
zend_class_entry *ce;

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);
}

object_init_ex(return_value, ce);
}
/* }}} */

/* {{{ proto public stdclass ReflectionClass::newInstanceArgs([array args])
Returns an instance of this class */
ZEND_METHOD(reflection_class, newInstanceArgs)
Expand Down Expand Up @@ -5694,6 +5713,9 @@ ZEND_BEGIN_ARG_INFO(arginfo_reflection_class_newInstance, 0)
ZEND_ARG_INFO(0, args)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO(arginfo_reflection_class_newInstanceWithoutConstructor, 0)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_class_newInstanceArgs, 0, 0, 0)
ZEND_ARG_ARRAY_INFO(0, args, 0)
ZEND_END_ARG_INFO()
Expand Down Expand Up @@ -5742,6 +5764,7 @@ static const zend_function_entry reflection_class_functions[] = {
ZEND_ME(reflection_class, getModifiers, arginfo_reflection__void, 0)
ZEND_ME(reflection_class, isInstance, arginfo_reflection_class_isInstance, 0)
ZEND_ME(reflection_class, newInstance, arginfo_reflection_class_newInstance, 0)
ZEND_ME(reflection_class, newInstanceWithoutConstructor, arginfo_reflection_class_newInstanceWithoutConstructor, 0)
ZEND_ME(reflection_class, newInstanceArgs, arginfo_reflection_class_newInstanceArgs, 0)
ZEND_ME(reflection_class, getParentClass, arginfo_reflection__void, 0)
ZEND_ME(reflection_class, isSubclassOf, arginfo_reflection_class_isSubclassOf, 0)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
--TEST--
ReflectionClass::newInstanceWithoutConstructor()
--CREDITS--
Sebastian Bergmann <[email protected]>
--FILE--
<?php
class Foo
{
public function __construct()
{
print __METHOD__;
}
}

$class = new ReflectionClass('Foo');
var_dump($class->newInstanceWithoutConstructor());

$class = new ReflectionClass('StdClass');
var_dump($class->newInstanceWithoutConstructor());

$class = new ReflectionClass('DateTime');
var_dump($class->newInstanceWithoutConstructor());
--EXPECTF--
object(Foo)#%d (0) {
}
object(stdClass)#%d (0) {
}

Fatal error: Uncaught exception 'ReflectionException' with message 'Class DateTime is an internal class that cannot be instantiated without invoking its constructor' in %s/tests/ReflectionClass_newInstanceWithoutConstructor.php:%d
Stack trace:
#0 %s/ReflectionClass_newInstanceWithoutConstructor.php(%d): ReflectionClass->newInstanceWithoutConstructor()
#1 {main}
thrown in %s/ReflectionClass_newInstanceWithoutConstructor.php on line %d
8 changes: 7 additions & 1 deletion ext/reflection/tests/ReflectionClass_toString_001.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Class [ <internal:Reflection> class ReflectionClass implements Reflector ] {
Property [ <default> public $name ]
}

- Methods [48] {
- Methods [49] {
Method [ <internal:Reflection> final private method __clone ] {

- Parameters [0] {
Expand Down Expand Up @@ -250,6 +250,12 @@ Class [ <internal:Reflection> class ReflectionClass implements Reflector ] {
}
}

Method [ <internal:Reflection> public method newInstanceWithoutConstructor ] {

- Parameters [0] {
}
}

Method [ <internal:Reflection> public method newInstanceArgs ] {

- Parameters [1] {
Expand Down

0 comments on commit a702406

Please sign in to comment.