我们有一个抛出错误的错误处理程序: __PHP_Incomplete_Class无法转换为字符串。如何从不完整的课程中获取课程名称?
错误处理程序当前执行'is_object'测试,对于'Incomplete'对象奇怪地是错误的。我试图调整错误处理程序,但我无法获取原始类名称,而无需解析重新序列化的版本。
<?php
$o = 'O:14:"BogusTestClass":0:{}';
$c = unserialize($o);
var_dump(
array(
'subject' => $c,
'is_object' => is_object($c), // false !?!?
'get_class' => get_class($c), // __PHP_Incomplete_Class
'gettype' => gettype($c), // 'object'
'Is instance of?' => $c instanceof __PHP_Incomplete_Class, // true
'serial' => serialize($c),
)
);
// Tried:
var_dump($c->__PHP_Incomplete_Class_Name);
// Error:
// The script tried to execute a method or access a property of
// an incomplete object
$refObj = new ReflectionObject($c);
$refProp = $refObj->getProperty('__PHP_Incomplete_Class_Name');
$refProp->setAccessible(true);
var_dump($refProp->getValue($c));
// Error:
// ReflectionProperty::getValue(): The script tried to execute a
// method or access a property of an incomplete object.
// This works, but is fragile, since it depends on internal behavior
// of serialize
function getBadClassName($subject)
{
$serial = serialize($subject);
$parts = explode(':', $serial, 4);
if ('O' === $parts[0] && strlen($parts[2]) -2 == $parts[1]) {
return substr($parts[2], 1, -1);
}
return '-- Error --';
}
var_dump(getBadClassName($c));
试图从不完整的对象中获取序列化类的名称以用于错误消息。
避免解析字符串,因为我猜测字符串解析会在使用重定义序列化/反序列化的扩展时崩溃,如http://pecl.php.net/package/igbinary或http://pecl.php.net/package/APC/3.1.7 apc.serializer挂钩。
错误被抛出一个错误?你除以零不是吗?你不是吗?! –
从Symfony2的FlattenException引发错误,并且如果为不完整的对象添加一点点,将会很微不足道,但如果可能的话,想添加缺少的名称。 – rrehbein