Skip to content

Commit ef5978d

Browse files
committed
Dumper::dumpObject() refactoring
1 parent 90c76b5 commit ef5978d

File tree

2 files changed

+22
-23
lines changed

2 files changed

+22
-23
lines changed

src/PhpGenerator/Dumper.php

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,9 @@ private function dumpArray(array &$var, array $parents, int $level, int $column)
139139
private function dumpObject(object $var, array $parents, int $level): string
140140
{
141141
$class = $var::class;
142-
if (method_exists($var, '__serialize')) {
143-
$data = $this->dump($var->__serialize());
144-
return '\\' . self::class . "::createObject(\\$class::class, $data)";
142+
143+
if (in_array($class, [\DateTime::class, \DateTimeImmutable::class], true)) {
144+
return $this->format("new \\$class(?, new \\DateTimeZone(?))", $var->format('Y-m-d H:i:s.u'), $var->getTimeZone()->getName());
145145

146146
} elseif ($var instanceof \Serializable) { // deprecated
147147
return 'unserialize(' . $this->dumpString(serialize($var)) . ')';
@@ -158,29 +158,28 @@ private function dumpObject(object $var, array $parents, int $level): string
158158
}
159159

160160
throw new Nette\InvalidArgumentException('Cannot dump closure.');
161-
}
162161

163-
if ((new \ReflectionObject($var))->isAnonymous()) {
162+
} elseif ((new \ReflectionObject($var))->isAnonymous()) {
164163
throw new Nette\InvalidArgumentException('Cannot dump anonymous class.');
165164

166-
} elseif (in_array($class, [\DateTime::class, \DateTimeImmutable::class], true)) {
167-
return $this->format("new \\$class(?, new \\DateTimeZone(?))", $var->format('Y-m-d H:i:s.u'), $var->getTimeZone()->getName());
165+
} elseif ($level > $this->maxDepth || in_array($var, $parents, true)) {
166+
throw new Nette\InvalidArgumentException('Nesting level too deep or recursive dependency.');
168167
}
169168

170-
$arr = (array) $var;
171-
$space = str_repeat($this->indentation, $level);
172-
173-
if ($level > $this->maxDepth || in_array($var, $parents, true)) {
174-
throw new Nette\InvalidArgumentException('Nesting level too deep or recursive dependency.');
169+
if (method_exists($var, '__serialize')) {
170+
$arr = $var->__serialize();
171+
} else {
172+
$arr = (array) $var;
173+
if (method_exists($var, '__sleep')) {
174+
foreach ($var->__sleep() as $v) {
175+
$props[$v] = $props["\x00*\x00$v"] = $props["\x00$class\x00$v"] = true;
176+
}
177+
}
175178
}
176179

180+
$space = str_repeat($this->indentation, $level);
177181
$out = "\n";
178182
$parents[] = $var;
179-
if (method_exists($var, '__sleep')) {
180-
foreach ($var->__sleep() as $v) {
181-
$props[$v] = $props["\x00*\x00$v"] = $props["\x00$class\x00$v"] = true;
182-
}
183-
}
184183

185184
foreach ($arr as $k => &$v) {
186185
if (!isset($props) || isset($props[$k])) {
@@ -195,7 +194,7 @@ private function dumpObject(object $var, array $parents, int $level): string
195194
$out .= $space;
196195
return $class === \stdClass::class
197196
? "(object) [$out]"
198-
: '\\' . self::class . "::createObject('$class', [$out])";
197+
: '\\' . self::class . "::createObject(\\$class::class, [$out])";
199198
}
200199

201200

tests/PhpGenerator/Dumper.dump().phpt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class Test
8686
}
8787

8888
Assert::same(
89-
"\\Nette\\PhpGenerator\\Dumper::createObject('Test', [\n\t'a' => 1,\n\t\"\\x00*\\x00b\" => 2,\n\t\"\\x00Test\\x00c\" => 3,\n])",
89+
"\\Nette\\PhpGenerator\\Dumper::createObject(\\Test::class, [\n\t'a' => 1,\n\t\"\\x00*\\x00b\" => 2,\n\t\"\\x00Test\\x00c\" => 3,\n])",
9090
$dumper->dump(new Test),
9191
);
9292
Assert::equal(new Test, eval('return ' . $dumper->dump(new Test) . ';'));
@@ -112,8 +112,8 @@ class Test2 extends Test
112112

113113
Assert::same(
114114
PHP_VERSION_ID < 80100
115-
? "\\Nette\\PhpGenerator\\Dumper::createObject('Test2', [\n\t\"\\x00Test2\\x00c\" => 4,\n\t'a' => 1,\n\t\"\\x00*\\x00b\" => 2,\n])"
116-
: "\\Nette\\PhpGenerator\\Dumper::createObject('Test2', [\n\t'a' => 1,\n\t\"\\x00*\\x00b\" => 2,\n\t\"\\x00Test2\\x00c\" => 4,\n])",
115+
? "\\Nette\\PhpGenerator\\Dumper::createObject(\\Test2::class, [\n\t\"\\x00Test2\\x00c\" => 4,\n\t'a' => 1,\n\t\"\\x00*\\x00b\" => 2,\n])"
116+
: "\\Nette\\PhpGenerator\\Dumper::createObject(\\Test2::class, [\n\t'a' => 1,\n\t\"\\x00*\\x00b\" => 2,\n\t\"\\x00Test2\\x00c\" => 4,\n])",
117117
$dumper->dump(new Test2),
118118
);
119119
Assert::equal(new Test2, eval('return ' . $dumper->dump(new Test2) . ';'));
@@ -188,7 +188,7 @@ class TestSer
188188

189189

190190
$dumper = new Dumper;
191-
Assert::same('\Nette\PhpGenerator\Dumper::createObject(\TestSer::class, [\'a\', \'b\'])', $dumper->dump(new TestSer));
191+
Assert::same("\\Nette\\PhpGenerator\\Dumper::createObject(\\TestSer::class, [\n\t0 => 'a',\n\t1 => 'b',\n])", $dumper->dump(new TestSer));
192192
Assert::equal(new TestSer, eval('return ' . $dumper->dump(new TestSer) . ';'));
193193

194194

@@ -207,7 +207,7 @@ Assert::same(
207207
$dumper->dump(new DateTimeImmutable('2016-06-22 20:52:43.1234', new DateTimeZone('Europe/Prague'))),
208208
);
209209
same(
210-
"\\Nette\\PhpGenerator\\Dumper::createObject('TestDateTime', [
210+
"\\Nette\\PhpGenerator\\Dumper::createObject(\\TestDateTime::class, [
211211
'date' => '2016-06-22 20:52:43.123400',
212212
'timezone_type' => 3,
213213
'timezone' => 'Europe/Prague',

0 commit comments

Comments
 (0)