Fixing VarDumper for throwing PHP Fatal when dumping __PHP_Incomplete_Class. #11196 issue.

This commit is contained in:
Damian Zajkowski
2016-03-25 15:54:15 +01:00
parent 88f9c0094d
commit 3fb85fb84e
3 changed files with 20 additions and 2 deletions

View File

@ -4,6 +4,7 @@ Yii Framework 2 Change Log
2.0.8 under development
-----------------------
- Bug #11196: Fixed VarDumper throws PHP Fatal when dumping __PHP_Incomplete_Class (DamianZ)
- Bug #9851: Fixed partial commit / rollback in nested transactions (sammousa)
- Bug #10784: Fixed `yii\grid\CheckboxColumn` to set correct value when `yii\grid\CheckboxColumn::$checkboxOptions` closure is used (nukkumatti)
- Bug #10850: Fixed unable to use 'definitions' and 'aliases' at `yii\widgets\MaskedInput` (rahimov, klimov-paul)

View File

@ -117,7 +117,7 @@ class BaseVarDumper
$className = get_class($var);
$spaces = str_repeat(' ', $level * 4);
self::$_output .= "$className#$id\n" . $spaces . '(';
if (method_exists($var, '__debugInfo')) {
if ('__PHP_Incomplete_Class' !== get_class($var) && method_exists($var, '__debugInfo')) {
$dumpValues = $var->__debugInfo();
if (!is_array($dumpValues)) {
throw new InvalidValueException('__debuginfo() must return an array');
@ -208,7 +208,7 @@ class BaseVarDumper
}
self::exportInternal($varAsArray, $level);
return;
} elseif (method_exists($var, '__toString')) {
} elseif ('__PHP_Incomplete_Class' !== get_class($var) && method_exists($var, '__toString')) {
$output = var_export($var->__toString(), true);
} else {
$outputBackup = self::$_output;

View File

@ -10,6 +10,23 @@ use yiiunit\TestCase;
*/
class VarDumperTest extends TestCase
{
public function testDumpIncompleteObject()
{
$serializedObj = 'O:16:"nonExistingClass":0:{}';
$incompleteObj = unserialize($serializedObj);
$dumpResult = VarDumper::dumpAsString($incompleteObj);
$this->assertContains("__PHP_Incomplete_Class#1\n(", $dumpResult);
$this->assertContains("nonExistingClass", $dumpResult);
}
public function testExportIncompleteObject()
{
$serializedObj = 'O:16:"nonExistingClass":0:{}';
$incompleteObj = unserialize($serializedObj);
$exportResult = VarDumper::export($incompleteObj);
$this->assertContains("nonExistingClass", $exportResult);
}
public function testDumpObject()
{
$obj = new \StdClass();