Skip to content

Commit b8dfd32

Browse files
committed
Helpers::dump - added support for __sleep and Serializable
1 parent 16ae16a commit b8dfd32

File tree

2 files changed

+62
-15
lines changed

2 files changed

+62
-15
lines changed

src/PhpGenerator/Helpers.php

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,29 +87,38 @@ private static function _dump(& $var, $level = 0)
8787
}
8888
return 'array(' . (strpos($out, "\n") === FALSE && strlen($out) < 40 ? $out : $outAlt) . ')';
8989

90+
} elseif ($var instanceof \Serializable) {
91+
$var = serialize($var);
92+
return 'unserialize(' . self::_dump($var, $level) . ')';
93+
9094
} elseif (is_object($var)) {
9195
$arr = (array) $var;
9296
$space = str_repeat("\t", $level);
97+
$class = get_class($var);
9398

9499
static $list = array();
95-
if (empty($arr)) {
96-
$out = '';
97-
98-
} elseif ($level > 50 || in_array($var, $list, TRUE)) {
100+
if ($level > 50 || in_array($var, $list, TRUE)) {
99101
throw new Nette\InvalidArgumentException('Nesting level too deep or recursive dependency.');
100102

101103
} else {
102104
$out = "\n";
103105
$list[] = $var;
106+
if (method_exists($var, '__sleep')) {
107+
foreach ($var->__sleep() as $v) {
108+
$props[$v] = $props["\x00*\x00$v"] = $props["\x00$class\x00$v"] = TRUE;
109+
}
110+
}
104111
foreach ($arr as $k => & $v) {
105-
$out .= "$space\t" . self::_dump($k, $level + 1) . " => " . self::_dump($v, $level + 1) . ",\n";
112+
if (!isset($props) || isset($props[$k])) {
113+
$out .= "$space\t" . self::_dump($k, $level + 1) . " => " . self::_dump($v, $level + 1) . ",\n";
114+
}
106115
}
107116
array_pop($list);
108117
$out .= $space;
109118
}
110-
return get_class($var) === 'stdClass'
119+
return $class === 'stdClass'
111120
? "(object) array($out)"
112-
: __CLASS__ . "::createObject('" . get_class($var) . "', array($out))";
121+
: __CLASS__ . "::createObject('$class', array($out))";
113122

114123
} elseif (is_resource($var)) {
115124
throw new Nette\InvalidArgumentException('Cannot dump resource.');

tests/PhpGenerator/Helpers.dump().phpt

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,6 @@ use Nette\PhpGenerator\Helpers,
1212
require __DIR__ . '/../bootstrap.php';
1313

1414

15-
class Test
16-
{
17-
public $a = 1;
18-
protected $b = 2;
19-
private $c = 3;
20-
}
21-
22-
2315
Assert::same( '1', Helpers::dump(1) );
2416
Assert::same( '1.0', Helpers::dump(1.0) );
2517
Assert::same( 'NULL', Helpers::dump(NULL) );
@@ -41,5 +33,51 @@ Assert::same( "array('a' => 1, array(\"\\r\" => \"\\r\", 2), 3)", Helpers::dump(
4133

4234
Assert::same( "(object) array(\n\t'a' => 1,\n\t'b' => 2,\n)", Helpers::dump((object) array('a' => 1, 'b' => 2)) );
4335
Assert::same( "(object) array(\n\t'a' => (object) array(\n\t\t'b' => 2,\n\t),\n)" , Helpers::dump((object) array('a' => (object) array('b' => 2))) );
36+
37+
38+
class Test
39+
{
40+
public $a = 1;
41+
protected $b = 2;
42+
private $c = 3;
43+
}
44+
4445
Assert::same( "Nette\\PhpGenerator\\Helpers::createObject('Test', array(\n\t'a' => 1,\n\t\"\\x00*\\x00b\" => 2,\n\t\"\\x00Test\\x00c\" => 3,\n))", Helpers::dump(new Test) );
4546
Assert::equal( new Test, eval('return ' . Helpers::dump(new Test) . ';') );
47+
48+
49+
class Test2 extends Test
50+
{
51+
private $c = 4;
52+
public $d = 5;
53+
54+
function __sleep()
55+
{
56+
return array('c', 'b', 'a');
57+
}
58+
59+
function __wakeup()
60+
{
61+
}
62+
}
63+
64+
Assert::same( "Nette\\PhpGenerator\\Helpers::createObject('Test2', array(\n\t\"\\x00Test2\\x00c\" => 4,\n\t'a' => 1,\n\t\"\\x00*\\x00b\" => 2,\n))", Helpers::dump(new Test2) );
65+
Assert::equal( new Test2, eval('return ' . Helpers::dump(new Test2) . ';') );
66+
67+
68+
class Test3 implements Serializable
69+
{
70+
private $a;
71+
72+
function serialize()
73+
{
74+
return '';
75+
}
76+
77+
function unserialize($s)
78+
{
79+
}
80+
}
81+
82+
Assert::same( 'unserialize(\'C:5:"Test3":0:{}\')', Helpers::dump(new Test3) );
83+
Assert::equal( new Test3, eval('return ' . Helpers::dump(new Test3) . ';') );

0 commit comments

Comments
 (0)