Sara Golemon


PHP RFC: __debugInfo()


This RFC is for exposing the “get_debug_info” API already available to internal classes (written in C) to PHP classes via a magic method called __debugInfo().

Example Usage:

class File {
  // "Resource(stream)" isn't all that useful
  private $fp;

  // But all the stream meta data is
  public function __debugInfo() {
    return $this->fp ? stream_get_meta_data($fp) : [];

  public function open($filename, $mode = 'r'){
    $this->fp = fopen($filename, $mode);

$f = new File;
var_dump($f); // object(File)#1 { }
object(File)#1 {
  string(4) "http"
  string(10) "tcp_socket"

Backward Incompatible Changes

Double underscore is a reserved namespace, so any classes which happen to implement this are the ones which need to change.

Impact to Existing Extensions

Existing fallback behavior for internal classes not overriding get_debug_info is preserved via chaining to get_properties when no __debugInfo function is defined.

Proposed PHP Version(s)


Alternates under discussion

  • Rather than use __debugInfo() as the whole property info result, either merge it with the properties table or stuff it into a "__debugInfo" property and return it with the full properties table.

IMO, this takes control away from the user and removes a particularly useful reason for having the __debugInfo() magic method in the first place. Consider an object which points at itself (or more likely, another object which points back at the original). This normally results in a recursive loop. This is detected by the var_dump() routine, but only after a couple cycles. A more intelligent __debugInfo() output could avoid any iterations of the loop.

Potential expansions of scope

  • Add ReflectionObject::getDebugInfo() to return the result of zend_object_handlers→get_debug_info as an array of ReflectionParameter objects

Revision History

  • 1.1 (2014-01-22) - Changed name from __debug_info to __debugInfo and added alternates/expansion headings
  • 1.0 (2014-01-21) - Initial Revision



An option needs 50%+1 votes to win

Merge ___debugInfo() (88.9% approved)
User Vote
aharvey Yes (5.6)
ajf Yes (5.6)
bwoebi Yes (5.6)
chobieeee Yes (5.6)
chregu Yes (5.6)
dsp Yes (5.6)
fa Yes (5.6)
googleguy No
indeyets Yes (5.6)
jpauli Yes (5.6)
jwage Yes (5.6)
kassner Yes (5.6)
krakjoe Yes (5.6)
levim No
lstrojny Yes (5.6)
malukenho Yes (5.6)
mbeccati Yes (5.6)
peehaa Yes (5.6)
pollita Yes (5.6)
rdlowrey Yes (5.6)
remi Yes (5.6)
salathe Yes (5.7)
sebastian Yes (5.6)
stas No
treffynnon Yes (5.6)
willfitch Yes (5.6)
yohgaki Yes (5.6)
Name ___debugInfo() (100% approved)
User Vote
aharvey __debugInfo()
ajf __debug()
bwoebi __debugInfo()
chobieeee __debugInfo()
chregu __debugInfo()
dsp __debugInfo()
fa __debugInfo()
indeyets __debugInfo()
jpauli __debugInfo()
krakjoe __debugInfo()
levim __debugInfo()
lstrojny __debugInfo()
malukenho __debugInfo()
mariuz __debugInfo()
mbeccati __debugInfo()
nikic __debugInfo()
pollita __debugInfo()
rdlowrey __debugInfo()
remi __debugInfo()
salathe __debugInfo()
sebastian __debugInfo()
stas __debugInfo()
willfitch __debugInfo()
yohgaki __debugInfo()