18. register_shutdown_function("_PEAR_call_destructors");
显然,_PEAR_call_destructors 就是那个析构过程了,代码和 Pear()有些类似。
<? Code ?>
function _PEAR_call_destructors()
{
global $_PEAR_destructor_object_list;
if (is_array($_PEAR_destructor_object_list) &&
sizeof($_PEAR_destructor_object_list))
{ reset($_PEAR_destructor_object_list);
while (list($k, $objref) = each($_PEAR_destructor_object_list))
{ $classname = get_class($objref);
while ($classname) { $destructor = "_$classname";
if (method_exists($objref, $destructor)) { $objref->$destructor();
break;
} else { $classname = get_parent_class($classname);
}
}
} // Empty the object list to ensure that destructors are
// not called more than once. $_PEAR_destructor_object_list = array();
} // Now call the shutdown functions if
(is_array($GLOBALS['_PEAR_shutdown_funcs'])
AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) {
foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value)
{ call_user_func_array($value[0], $value[1]);
}
}
}
总结一下,Pear 在初始化时建立了需要析构的对象数组,并利用了 register_shutdown_function 触发析构函数,
_PEAR_call_destructors,从而完美的模拟了析构过程。
PHPMORE VOL5 17/26