This commit is contained in:
Sebastian Bergmann 2011-08-26 07:40:31 +00:00
parent fa09c70704
commit a70240637d
3 changed files with 63 additions and 1 deletions

View File

@ -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)
@ -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()
@ -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)

View File

@ -0,0 +1,33 @@
--TEST--
ReflectionClass::newInstanceWithoutConstructor()
--CREDITS--
Sebastian Bergmann <sebastian@php.net>
--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

View File

@ -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] {
@ -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] {