| // | Stig Bakken | // +----------------------------------------------------------------------+ // // $Id$ // define('PEAR_ERROR_RETURN', 0); define('PEAR_ERROR_PRINT', 1); define('PEAR_ERROR_TRIGGER', 2); define('PEAR_ERROR_DIE', 3); define('PHP_BINDIR', '@prefix@/bin'); define('PEAR_INSTALL_DIR', '@PEAR_INSTALLDIR@'); define('PEAR_EXTENSION_DIR', '@EXTENSION_DIR@'); $_PEAR_destructor_object_list = array(); // // Tests needed: - PEAR inheritance // - destructors // /** * Base class for other PEAR classes. Provides rudimentary * emulation of destructors. * * If you want a destructor in your class, inherit PEAR and make a * destructor method called _yourclassname (same name as the * constructor, but with a "_" prefix). Also, in your constructor you * have to call the PEAR constructor: $this->PEAR();. * The destructor method will be called without parameters. Note that * at in some SAPI implementations (such as Apache), any output during * the request shutdown (in which destructors are called) seems to be * discarded. If you need to get any debug information from your * destructor, use error_log(), syslog() or * something like that instead. * * @since PHP 4.0.2 * @author Stig Bakken */ class PEAR { // {{{ properties var $_debug = false; // }}} // {{{ constructor /** * Constructor. Registers this object in * $_PEAR_destructor_object_list for destructor emulation. */ function PEAR() { global $_PEAR_destructor_object_list; $_PEAR_destructor_object_list[] = &$this; if ($this->_debug) { printf("PEAR constructor called, class=%s\n", get_class($this)); } } // }}} // {{{ destructor /** * Destructor (the emulated type of...). Does nothing right now, * but is included for forward compatibility, so subclass * destructors should always call it. * * See the note in the class desciption about output from * destructors. * * @access public */ function _PEAR() { } // }}} // {{{ isError() /** * Tell whether a value is a PEAR error. * * @param $data the value to test * @access public * @return bool true if $data is an error */ function isError(&$data) { return (bool)(is_object($data) && (get_class($data) == "pear_error" || is_subclass_of($data, "pear_error"))); } // }}} } // {{{ _PEAR_call_destructors() 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)) { $destructor = "_".get_class($objref); if (method_exists($objref, $destructor)) { $objref->$destructor(); } } // Empty the object list to ensure that destructors are // not called more than once. $_PEAR_destructor_object_list = array(); } } // }}} class PEAR_Error { // {{{ properties var $classname = ''; var $error_message_prefix = ''; var $error_prepend = ''; var $error_append = ''; var $mode = PEAR_ERROR_RETURN; var $level = E_USER_NOTICE; var $code = -1; var $message = ''; // Wait until we have a stack-groping function in PHP. //var $file = ''; //var $line = 0; // }}} // {{{ constructor /** * PEAR_Error constructor * * @param $message error message * @param $code (optional) error code * */ function PEAR_Error($message = 'unknown error', $code = 0, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE) { $this->message = $message; $this->code = $code; $this->mode = $mode; $this->level = $level; if (!$this->classname) { $this->classname = get_class($this); } switch ($this->mode) { case PEAR_ERROR_PRINT: print $this->getMessage(); break; case PEAR_ERROR_TRIGGER: trigger_error($this->getMessage(), $this->level); break; case PEAR_ERROR_DIE: die($this->getMessage()); break; case PEAR_ERROR_RETURN: default: break; } } // }}} // {{{ getMessage() /** * Get the error message from an error object. * * @return string full error message */ function getMessage () { return ($this->error_prepend . $this->error_message_prefix . $this->message . $this->error_append); } // }}} // {{{ getCode() /** * Get error code from an error object * * @return int error code */ function getCode () { return ($this->code); } // }}} // {{{ getType() /** * Get the name of this error/exception. * * @return string error/exception name (type) */ function getType () { return $this->classname; } // }}} // {{{ __string_value() /** * Make a string representation of this object. * * @return string a string with an object "summary" */ function __string_value() { $modes = array(PEAR_ERROR_RETURN => "return", PEAR_ERROR_PRINT => "print", PEAR_ERROR_TRIGGER => "trigger", PEAR_ERROR_DIE => "die"); $levels = array(E_USER_NOTICE => "notice", E_USER_WARNING => "warning", E_USER_ERROR => "error"); return sprintf("[%s: message=\"%s\" code=%d mode=%s level=%s prefix=\"%s\" prepend=\"%s\" append=\"%s\"]", get_class($this), $this->message, $this->code, $modes[$this->mode], $levels[$this->level], $this->error_message_prefix, $this->error_prepend, $this->error_append); } // }}} } register_shutdown_function("_PEAR_call_destructors"); /* * Local Variables: * mode: c++ * tab-width: 4 * c-basic-offset: 4 * End: */ ?>