Dumping many kinds of object with var_dump() leads to dumping the whole address space, because a chain of references leads to MediaWikiServices. So, introduce a trait which replaces the problematic properties with a placeholder, if their doc comment contains @noVarDump. Bug: T277618 Change-Id: Ifa685c26fbc5317d0359544289ec3f433ec4fedf
41 lines
1.2 KiB
PHP
41 lines
1.2 KiB
PHP
<?php
|
|
|
|
namespace Wikimedia\DebugInfo;
|
|
|
|
/**
|
|
* @since 1.40
|
|
*/
|
|
class DumpUtils {
|
|
/**
|
|
* Convert an object to an array by casting, but filter the properties
|
|
* to make recursive dumping more feasible.
|
|
*
|
|
* phpcs:ignore MediaWiki.Commenting.FunctionComment.ObjectTypeHintParam
|
|
* @param object $object
|
|
* @return array
|
|
* @throws \ReflectionException
|
|
*/
|
|
public static function objectToArray( $object ) {
|
|
$vars = (array)$object;
|
|
$class = new \ReflectionClass( $object );
|
|
while ( $class ) {
|
|
foreach ( $class->getProperties() as $property ) {
|
|
if ( AnnotationReader::propertyHasAnnotation( $property, 'noVarDump' ) ) {
|
|
// Ref: zend_declare_typed_property(), zend_mangle_property_name()
|
|
if ( $property->isPrivate() ) {
|
|
$mangledName = "\0{$class->name}\0{$property->name}";
|
|
} elseif ( $property->isProtected() ) {
|
|
$mangledName = "\0*\0{$property->name}";
|
|
} else {
|
|
$mangledName = $property->name;
|
|
}
|
|
if ( isset( $vars[$mangledName] ) && !is_scalar( $vars[$mangledName] ) ) {
|
|
$vars[$mangledName] = new Placeholder( $vars[$mangledName] );
|
|
}
|
|
}
|
|
}
|
|
$class = $class->getParentClass();
|
|
}
|
|
return $vars;
|
|
}
|
|
}
|