31 define(
'PEAR_ERROR_RETURN', 1);
32 define(
'PEAR_ERROR_PRINT', 2);
33 define(
'PEAR_ERROR_TRIGGER', 4);
34 define(
'PEAR_ERROR_DIE', 8);
35 define(
'PEAR_ERROR_CALLBACK', 16);
40 define(
'PEAR_ERROR_EXCEPTION', 32);
42 define(
'PEAR_ZE2', (function_exists(
'version_compare') &&
43 version_compare(zend_version(),
"2-dev",
"ge")));
45 if (substr(PHP_OS, 0, 3) ==
'WIN') {
46 define(
'OS_WINDOWS',
true);
47 define(
'OS_UNIX',
false);
48 define(
'PEAR_OS',
'Windows');
50 define(
'OS_WINDOWS',
false);
51 define(
'OS_UNIX',
true);
52 define(
'PEAR_OS',
'Unix');
56 if (!defined(
'PATH_SEPARATOR')) {
58 define(
'PATH_SEPARATOR',
';');
60 define(
'PATH_SEPARATOR',
':');
65 $GLOBALS[
'_PEAR_default_error_options'] = E_USER_NOTICE;
66 $GLOBALS[
'_PEAR_destructor_object_list'] = array();
68 $GLOBALS[
'_PEAR_error_handler_stack'] = array();
70 @ini_set(
'track_errors',
true);
170 function PEAR($error_class = null)
172 $classname = strtolower(get_class($this));
174 print
"PEAR constructor called, class=$classname\n";
176 if ($error_class !== null) {
177 $this->_error_class = $error_class;
179 while ($classname && strcasecmp($classname,
"pear")) {
180 $destructor =
"_$classname";
181 if (method_exists($this, $destructor)) {
182 global $_PEAR_destructor_object_list;
183 $_PEAR_destructor_object_list[] = &$this;
184 if (!isset(
$GLOBALS[
'_PEAR_SHUTDOWN_REGISTERED'])) {
185 register_shutdown_function(
"_PEAR_call_destructors");
186 $GLOBALS[
'_PEAR_SHUTDOWN_REGISTERED'] =
true;
190 $classname = get_parent_class($classname);
211 printf(
"PEAR destructor called, class=%s\n", strtolower(get_class($this)));
233 if (!isset($properties[$class])) {
234 $properties[$class] = array();
236 if (!array_key_exists($var, $properties[$class])) {
237 $properties[$class][$var] = null;
239 return $properties[$class][$var];
258 if (!isset(
$GLOBALS[
'_PEAR_SHUTDOWN_REGISTERED'])) {
259 register_shutdown_function(
"_PEAR_call_destructors");
260 $GLOBALS[
'_PEAR_SHUTDOWN_REGISTERED'] =
true;
262 $GLOBALS[
'_PEAR_shutdown_funcs'][] = array($func, $args);
281 if (is_a($data,
'PEAR_Error')) {
282 if (is_null($code)) {
284 } elseif (is_string($code)) {
285 return $data->getMessage() == $code;
287 return $data->getCode() == $code;
337 if (isset($this) && is_a($this,
'PEAR')) {
341 $setmode = &
$GLOBALS[
'_PEAR_default_error_mode'];
342 $setoptions = &
$GLOBALS[
'_PEAR_default_error_options'];
362 trigger_error(
"invalid error callback", E_USER_WARNING);
367 trigger_error(
"invalid error mode", E_USER_WARNING);
392 if (is_array($code)) {
393 array_push($this->_expected_errors, $code);
395 array_push($this->_expected_errors, array($code));
411 return array_pop($this->_expected_errors);
429 foreach ($this->_expected_errors AS $key => $error_array) {
430 if (in_array($error_code, $error_array)) {
431 unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
436 if (0 == count($this->_expected_errors[$key])) {
437 unset($this->_expected_errors[$key]);
459 if ((is_array($error_code) && (0 != count($error_code)))) {
463 foreach($error_code as $key => $error) {
470 return $deleted ?
true :
PEAR::raiseError(
"The expected error you submitted does not exist");
471 } elseif (!empty($error_code)) {
533 if (is_object($message)) {
534 $code = $message->getCode();
535 $userinfo = $message->getUserInfo();
536 $error_class = $message->getType();
537 $message->error_message_prefix =
'';
538 $message = $message->getMessage();
541 if (isset($this) && isset($this->_expected_errors) &&
sizeof($this->_expected_errors) > 0 &&
sizeof($exp = end($this->_expected_errors))) {
542 if ($exp[0] ==
"*" ||
543 (is_int(reset($exp)) && in_array($code, $exp)) ||
544 (is_string(reset($exp)) && in_array($message, $exp))) {
549 if ($mode === null) {
551 if (isset($this) && isset($this->_default_error_mode)) {
555 } elseif (isset(
$GLOBALS[
'_PEAR_default_error_mode'])) {
556 $mode =
$GLOBALS[
'_PEAR_default_error_mode'];
561 if ($error_class !== null) {
563 } elseif (isset($this) && isset($this->_error_class)) {
568 if (intval(PHP_VERSION) < 5) {
570 include
'PEAR/FixPHP5PEARWarnings.php';
574 $a =
new $ec($code, $mode,
$options, $userinfo);
576 $a =
new $ec($message, $code, $mode,
$options, $userinfo);
595 if (isset($this) && is_a($this,
'PEAR')) {
596 $a = &$this->
raiseError($message, $code, null, null, $userinfo);
607 $stack = &
$GLOBALS[
'_PEAR_error_handler_stack'];
608 $def_mode = &
$GLOBALS[
'_PEAR_default_error_mode'];
609 $def_options = &
$GLOBALS[
'_PEAR_default_error_options'];
610 $stack[] = array($def_mode, $def_options);
628 trigger_error(
"invalid error callback", E_USER_WARNING);
633 trigger_error(
"invalid error mode", E_USER_WARNING);
642 $stack = &
$GLOBALS[
'_PEAR_error_handler_stack'];
643 $setmode = &
$GLOBALS[
'_PEAR_default_error_mode'];
644 $setoptions = &
$GLOBALS[
'_PEAR_default_error_options'];
646 list($mode,
$options) = $stack[
sizeof($stack) - 1];
665 trigger_error(
"invalid error callback", E_USER_WARNING);
670 trigger_error(
"invalid error mode", E_USER_WARNING);
692 $stack = &
$GLOBALS[
'_PEAR_error_handler_stack'];
693 if (isset($this) && is_a($this,
'PEAR')) {
697 $def_mode = &
$GLOBALS[
'_PEAR_default_error_mode'];
698 $def_options = &
$GLOBALS[
'_PEAR_default_error_options'];
700 $stack[] = array($def_mode, $def_options);
702 if (isset($this) && is_a($this,
'PEAR')) {
723 $stack = &
$GLOBALS[
'_PEAR_error_handler_stack'];
725 list($mode,
$options) = $stack[
sizeof($stack) - 1];
727 if (isset($this) && is_a($this,
'PEAR')) {
747 if (!extension_loaded($ext)) {
749 if ((ini_get(
'enable_dl') != 1) || (ini_get(
'safe_mode') == 1)) {
754 } elseif (PHP_OS ==
'HP-UX') {
756 } elseif (PHP_OS ==
'AIX') {
758 } elseif (PHP_OS ==
'OSX') {
763 return @dl(
'php_'.$ext.$suffix) || @dl($ext.$suffix);
775 global $_PEAR_destructor_object_list;
776 if (is_array($_PEAR_destructor_object_list) &&
777 sizeof($_PEAR_destructor_object_list))
779 reset($_PEAR_destructor_object_list);
781 $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
783 while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
784 $classname = get_class($objref);
786 $destructor =
"_$classname";
787 if (method_exists($objref, $destructor)) {
788 $objref->$destructor();
791 $classname = get_parent_class($classname);
797 $_PEAR_destructor_object_list = array();
801 if (is_array(
$GLOBALS[
'_PEAR_shutdown_funcs']) AND !empty(
$GLOBALS[
'_PEAR_shutdown_funcs'])) {
802 foreach (
$GLOBALS[
'_PEAR_shutdown_funcs'] as $value) {
803 call_user_func_array($value[0], $value[1]);
864 if (
$mode === null) {
872 $this->backtrace = debug_backtrace();
873 if (isset($this->backtrace[0]) && isset($this->backtrace[0][
'object'])) {
874 unset($this->backtrace[0][
'object']);
878 $this->level = E_USER_NOTICE;
885 $this->callback = null;
896 trigger_error($this->
getMessage(), $this->level);
902 if (substr($msg, -1) !=
"\n") {
908 die(sprintf($format, $msg));
910 if ($this->mode & PEAR_ERROR_CALLBACK) {
911 if (is_callable($this->callback)) {
912 call_user_func($this->callback, $this);
916 trigger_error(
"PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
917 eval(
'$e = new Exception($this->message, $this->code);throw($e);');
944 return $this->callback;
959 return ($this->error_message_prefix . $this->message);
988 return get_class($this);
1032 if (defined(
'PEAR_IGNORE_BACKTRACE')) {
1035 if ($frame === null) {
1038 return $this->backtrace[$frame];
1046 if (empty($this->userinfo)) {
1047 $this->userinfo = $info;
1049 $this->userinfo .=
" ** $info";
1070 $levels = array(E_USER_NOTICE =>
'notice',
1071 E_USER_WARNING =>
'warning',
1072 E_USER_ERROR =>
'error');
1074 if (is_array($this->callback)) {
1075 $callback = (is_object($this->callback[0]) ?
1076 strtolower(get_class($this->callback[0])) :
1077 $this->callback[0]) .
'::' .
1080 $callback = $this->callback;
1082 return sprintf(
'[%s: message="%s" code=%d mode=callback '.
1083 'callback=%s prefix="%s" info="%s"]',
1084 strtolower(get_class($this)), $this->message, $this->code,
1085 $callback, $this->error_message_prefix,
1092 $modes[] =
'trigger';
1098 $modes[] =
'return';
1100 return sprintf(
'[%s: message="%s" code=%d mode=%s level=%s '.
1101 'prefix="%s" info="%s"]',
1102 strtolower(get_class($this)), $this->message, $this->code,
1103 implode(
"|", $modes), $levels[$this->level],
1104 $this->error_message_prefix,