Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions ext/reflection/php_reflection.c
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,16 @@ static int format_default_value(smart_str *str, zval *value) {
format_default_value(str, zv);
} ZEND_HASH_FOREACH_END();
smart_str_appendc(str, ']');
} else if (Z_TYPE_P(value) == IS_OBJECT) {
/* This branch is reached if the constant AST was already evaluated and
* resulted in an object; enums are already handled in smart_str_append_zval()
* (GH-15902) */
zend_object *obj = Z_OBJ_P(value);
zend_class_entry *class = obj->ce;
ZEND_ASSERT(!(class->ce_flags & ZEND_ACC_ENUM));
smart_str_appends(str, "object(");
smart_str_append(str, class->name);
smart_str_appends(str, ")");
} else {
ZEND_ASSERT(Z_TYPE_P(value) == IS_CONSTANT_AST);
zend_string *ast_str = zend_ast_export("", Z_ASTVAL_P(value), "");
Expand Down
37 changes: 37 additions & 0 deletions ext/reflection/tests/gh15902/ReflectionClass-callable.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
--TEST--
ReflectionClass object default property - used to say "callable"
--INI--
opcache.enable_cli=0
--FILE--
<?php

class C {
public stdClass $a = FOO;
}
define('FOO', new stdClass);

new C;

$reflector = new ReflectionClass(C::class);
echo $reflector;
?>
--EXPECTF--
Class [ <user> class C ] {
@@ %sReflectionClass-callable.php %d-%d

- Constants [0] {
}

- Static properties [0] {
}

- Static methods [0] {
}

- Properties [1] {
Property [ public stdClass $a = object(stdClass) ]
}

- Methods [0] {
}
}
38 changes: 38 additions & 0 deletions ext/reflection/tests/gh15902/ReflectionClass-class.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
--TEST--
ReflectionClass object default property - used to say "__CLASS__"
--INI--
opcache.enable_cli=0
--FILE--
<?php

class C {
public stdClass $a = FOO;
}
$reflector = new ReflectionClass(C::class);

define('FOO', new stdClass);
new C;

echo $reflector;

?>
--EXPECTF--
Class [ <user> class C ] {
@@ %sReflectionClass-class.php %d-%d

- Constants [0] {
}

- Static properties [0] {
}

- Static methods [0] {
}

- Properties [1] {
Property [ public stdClass $a = object(stdClass) ]
}

- Methods [0] {
}
}
20 changes: 20 additions & 0 deletions ext/reflection/tests/gh15902/ReflectionProperty-callable.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--TEST--
ReflectionProperty object default - used to say "callable"
--INI--
opcache.enable_cli=0
--FILE--
<?php

class C {
public stdClass $a = FOO;
}
define('FOO', new stdClass);

new C;

$reflector = new ReflectionProperty(C::class, 'a');
echo $reflector;

?>
--EXPECTF--
Property [ public stdClass $a = object(stdClass) ]
20 changes: 20 additions & 0 deletions ext/reflection/tests/gh15902/ReflectionProperty-class.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--TEST--
ReflectionProperty object default - used to say "__CLASS__"
--INI--
opcache.enable_cli=0
--FILE--
<?php

class C {
public stdClass $a = FOO;
}
$reflector = new ReflectionProperty(C::class, 'a');

define('FOO', new stdClass);
new C;

echo $reflector;

?>
--EXPECTF--
Property [ public stdClass $a = object(stdClass) ]
Loading