1 |
joko |
1.1 |
<?php |
2 |
|
|
// |
3 |
|
|
// +----------------------------------------------------------------------+ |
4 |
|
|
// | PHP Version 4 | |
5 |
|
|
// +----------------------------------------------------------------------+ |
6 |
|
|
// | Copyright (c) 1997-2002 The PHP Group | |
7 |
|
|
// +----------------------------------------------------------------------+ |
8 |
|
|
// | This source file is subject to version 2.0 of the PHP license, | |
9 |
|
|
// | that is bundled with this package in the file LICENSE, and is | |
10 |
|
|
// | available at through the world-wide-web at | |
11 |
|
|
// | http://www.php.net/license/2_02.txt. | |
12 |
|
|
// | If you did not receive a copy of the PHP license and are unable to | |
13 |
|
|
// | obtain it through the world-wide-web, please send a note to | |
14 |
|
|
// | license@php.net so we can mail you a copy immediately. | |
15 |
|
|
// +----------------------------------------------------------------------+ |
16 |
|
|
// | Authors: Sterling Hughes <sterling@php.net> | |
17 |
|
|
// | Stig Bakken <ssb@fast.no> | |
18 |
|
|
// | Tomas V.V.Cox <cox@idecnet.com> | |
19 |
|
|
// +----------------------------------------------------------------------+ |
20 |
|
|
// |
21 |
|
|
// Id: PEAR.php,v 1.32.2.2 2002/04/09 19:04:07 ssb Exp |
22 |
|
|
// |
23 |
|
|
|
24 |
|
|
define('PEAR_ERROR_RETURN', 1); |
25 |
|
|
define('PEAR_ERROR_PRINT', 2); |
26 |
|
|
define('PEAR_ERROR_TRIGGER', 4); |
27 |
|
|
define('PEAR_ERROR_DIE', 8); |
28 |
|
|
define('PEAR_ERROR_CALLBACK', 16); |
29 |
|
|
|
30 |
|
|
if (substr(PHP_OS, 0, 3) == 'WIN') { |
31 |
|
|
define('OS_WINDOWS', true); |
32 |
|
|
define('OS_UNIX', false); |
33 |
|
|
define('PEAR_OS', 'Windows'); |
34 |
|
|
} else { |
35 |
|
|
define('OS_WINDOWS', false); |
36 |
|
|
define('OS_UNIX', true); |
37 |
|
|
define('PEAR_OS', 'Unix'); // blatant assumption |
38 |
|
|
} |
39 |
|
|
|
40 |
|
|
$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; |
41 |
|
|
$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; |
42 |
|
|
$GLOBALS['_PEAR_default_error_callback'] = ''; |
43 |
|
|
$GLOBALS['_PEAR_destructor_object_list'] = array(); |
44 |
|
|
|
45 |
|
|
// |
46 |
|
|
// Tests needed: - PEAR inheritance |
47 |
|
|
// |
48 |
|
|
|
49 |
|
|
/** |
50 |
|
|
* Base class for other PEAR classes. Provides rudimentary |
51 |
|
|
* emulation of destructors. |
52 |
|
|
* |
53 |
|
|
* If you want a destructor in your class, inherit PEAR and make a |
54 |
|
|
* destructor method called _yourclassname (same name as the |
55 |
|
|
* constructor, but with a "_" prefix). Also, in your constructor you |
56 |
|
|
* have to call the PEAR constructor: $this->PEAR();. |
57 |
|
|
* The destructor method will be called without parameters. Note that |
58 |
|
|
* at in some SAPI implementations (such as Apache), any output during |
59 |
|
|
* the request shutdown (in which destructors are called) seems to be |
60 |
|
|
* discarded. If you need to get any debug information from your |
61 |
|
|
* destructor, use error_log(), syslog() or something similar. |
62 |
|
|
* |
63 |
|
|
* @since PHP 4.0.2 |
64 |
|
|
* @author Stig Bakken <ssb@fast.no> |
65 |
|
|
*/ |
66 |
|
|
class PEAR |
67 |
|
|
{ |
68 |
|
|
// {{{ properties |
69 |
|
|
|
70 |
|
|
/** |
71 |
|
|
* Whether to enable internal debug messages. |
72 |
|
|
* |
73 |
|
|
* @var bool |
74 |
|
|
* @access private |
75 |
|
|
*/ |
76 |
|
|
var $_debug = false; |
77 |
|
|
|
78 |
|
|
/** |
79 |
|
|
* Default error mode for this object. |
80 |
|
|
* |
81 |
|
|
* @var int |
82 |
|
|
* @access private |
83 |
|
|
*/ |
84 |
|
|
var $_default_error_mode = null; |
85 |
|
|
|
86 |
|
|
/** |
87 |
|
|
* Default error options used for this object when error mode |
88 |
|
|
* is PEAR_ERROR_TRIGGER. |
89 |
|
|
* |
90 |
|
|
* @var int |
91 |
|
|
* @access private |
92 |
|
|
*/ |
93 |
|
|
var $_default_error_options = null; |
94 |
|
|
|
95 |
|
|
/** |
96 |
|
|
* Default error handler (callback) for this object, if error mode is |
97 |
|
|
* PEAR_ERROR_CALLBACK. |
98 |
|
|
* |
99 |
|
|
* @var string |
100 |
|
|
* @access private |
101 |
|
|
*/ |
102 |
|
|
var $_default_error_handler = ''; |
103 |
|
|
|
104 |
|
|
/** |
105 |
|
|
* Which class to use for error objects. |
106 |
|
|
* |
107 |
|
|
* @var string |
108 |
|
|
* @access private |
109 |
|
|
*/ |
110 |
|
|
var $_error_class = 'PEAR_Error'; |
111 |
|
|
|
112 |
|
|
/** |
113 |
|
|
* An array of expected errors. |
114 |
|
|
* |
115 |
|
|
* @var array |
116 |
|
|
* @access private |
117 |
|
|
*/ |
118 |
|
|
var $_expected_errors = array(); |
119 |
|
|
|
120 |
|
|
// }}} |
121 |
|
|
|
122 |
|
|
// {{{ constructor |
123 |
|
|
|
124 |
|
|
/** |
125 |
|
|
* Constructor. Registers this object in |
126 |
|
|
* $_PEAR_destructor_object_list for destructor emulation if a |
127 |
|
|
* destructor object exists. |
128 |
|
|
* |
129 |
|
|
* @param string (optional) which class to use for error objects, |
130 |
|
|
* defaults to PEAR_Error. |
131 |
|
|
* @access public |
132 |
|
|
* @return void |
133 |
|
|
*/ |
134 |
|
|
function PEAR($error_class = null) |
135 |
|
|
{ |
136 |
|
|
$classname = get_class($this); |
137 |
|
|
if ($this->_debug) { |
138 |
|
|
print "PEAR constructor called, class=$classname\n"; |
139 |
|
|
} |
140 |
|
|
if ($error_class !== null) { |
141 |
|
|
$this->_error_class = $error_class; |
142 |
|
|
} |
143 |
|
|
while ($classname) { |
144 |
|
|
$destructor = "_$classname"; |
145 |
|
|
if (method_exists($this, $destructor)) { |
146 |
|
|
global $_PEAR_destructor_object_list; |
147 |
|
|
$_PEAR_destructor_object_list[] = &$this; |
148 |
|
|
break; |
149 |
|
|
} else { |
150 |
|
|
$classname = get_parent_class($classname); |
151 |
|
|
} |
152 |
|
|
} |
153 |
|
|
} |
154 |
|
|
|
155 |
|
|
// }}} |
156 |
|
|
// {{{ destructor |
157 |
|
|
|
158 |
|
|
/** |
159 |
|
|
* Destructor (the emulated type of...). Does nothing right now, |
160 |
|
|
* but is included for forward compatibility, so subclass |
161 |
|
|
* destructors should always call it. |
162 |
|
|
* |
163 |
|
|
* See the note in the class desciption about output from |
164 |
|
|
* destructors. |
165 |
|
|
* |
166 |
|
|
* @access public |
167 |
|
|
* @return void |
168 |
|
|
*/ |
169 |
|
|
function _PEAR() { |
170 |
|
|
if ($this->_debug) { |
171 |
|
|
printf("PEAR destructor called, class=%s\n", get_class($this)); |
172 |
|
|
} |
173 |
|
|
} |
174 |
|
|
|
175 |
|
|
// }}} |
176 |
|
|
// {{{ isError() |
177 |
|
|
|
178 |
|
|
/** |
179 |
|
|
* Tell whether a value is a PEAR error. |
180 |
|
|
* |
181 |
|
|
* @param mixed the value to test |
182 |
|
|
* @access public |
183 |
|
|
* @return bool true if parameter is an error |
184 |
|
|
*/ |
185 |
|
|
function isError($data) { |
186 |
|
|
return (bool)(is_object($data) && |
187 |
|
|
(get_class($data) == 'pear_error' || |
188 |
|
|
is_subclass_of($data, 'pear_error'))); |
189 |
|
|
} |
190 |
|
|
|
191 |
|
|
// }}} |
192 |
|
|
// {{{ setErrorHandling() |
193 |
|
|
|
194 |
|
|
/** |
195 |
|
|
* Sets how errors generated by this DB object should be handled. |
196 |
|
|
* Can be invoked both in objects and statically. If called |
197 |
|
|
* statically, setErrorHandling sets the default behaviour for all |
198 |
|
|
* PEAR objects. If called in an object, setErrorHandling sets |
199 |
|
|
* the default behaviour for that object. |
200 |
|
|
* |
201 |
|
|
* @param int $mode |
202 |
|
|
* One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, |
203 |
|
|
* PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE or |
204 |
|
|
* PEAR_ERROR_CALLBACK. |
205 |
|
|
* |
206 |
|
|
* @param mixed $options |
207 |
|
|
* When $mode is PEAR_ERROR_TRIGGER, this is the error level (one |
208 |
|
|
* of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). |
209 |
|
|
* |
210 |
|
|
* When $mode is PEAR_ERROR_CALLBACK, this parameter is expected |
211 |
|
|
* to be the callback function or method. A callback |
212 |
|
|
* function is a string with the name of the function, a |
213 |
|
|
* callback method is an array of two elements: the element |
214 |
|
|
* at index 0 is the object, and the element at index 1 is |
215 |
|
|
* the name of the method to call in the object. |
216 |
|
|
* |
217 |
|
|
* When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is |
218 |
|
|
* a printf format string used when printing the error |
219 |
|
|
* message. |
220 |
|
|
* |
221 |
|
|
* @access public |
222 |
|
|
* @return void |
223 |
|
|
* @see PEAR_ERROR_RETURN |
224 |
|
|
* @see PEAR_ERROR_PRINT |
225 |
|
|
* @see PEAR_ERROR_TRIGGER |
226 |
|
|
* @see PEAR_ERROR_DIE |
227 |
|
|
* @see PEAR_ERROR_CALLBACK |
228 |
|
|
* |
229 |
|
|
* @since PHP 4.0.5 |
230 |
|
|
*/ |
231 |
|
|
|
232 |
|
|
function setErrorHandling($mode = null, $options = null) |
233 |
|
|
{ |
234 |
|
|
if (isset($this)) { |
235 |
|
|
$setmode = &$this->_default_error_mode; |
236 |
|
|
$setoptions = &$this->_default_error_options; |
237 |
|
|
//$setcallback = &$this->_default_error_callback; |
238 |
|
|
} else { |
239 |
|
|
$setmode = &$GLOBALS['_PEAR_default_error_mode']; |
240 |
|
|
$setoptions = &$GLOBALS['_PEAR_default_error_options']; |
241 |
|
|
//$setcallback = &$GLOBALS['_PEAR_default_error_callback']; |
242 |
|
|
} |
243 |
|
|
|
244 |
|
|
switch ($mode) { |
245 |
|
|
case PEAR_ERROR_RETURN: |
246 |
|
|
case PEAR_ERROR_PRINT: |
247 |
|
|
case PEAR_ERROR_TRIGGER: |
248 |
|
|
case PEAR_ERROR_DIE: |
249 |
|
|
case null: |
250 |
|
|
$setmode = $mode; |
251 |
|
|
$setoptions = $options; |
252 |
|
|
break; |
253 |
|
|
|
254 |
|
|
case PEAR_ERROR_CALLBACK: |
255 |
|
|
$setmode = $mode; |
256 |
|
|
if ((is_string($options) && function_exists($options)) || |
257 |
|
|
(is_array($options) && method_exists(@$options[0], @$options[1]))) |
258 |
|
|
{ |
259 |
|
|
$setoptions = $options; |
260 |
|
|
} else { |
261 |
|
|
trigger_error("invalid error callback", E_USER_WARNING); |
262 |
|
|
} |
263 |
|
|
break; |
264 |
|
|
|
265 |
|
|
default: |
266 |
|
|
trigger_error("invalid error mode", E_USER_WARNING); |
267 |
|
|
break; |
268 |
|
|
} |
269 |
|
|
} |
270 |
|
|
|
271 |
|
|
// }}} |
272 |
|
|
// {{{ expectError() |
273 |
|
|
|
274 |
|
|
/** |
275 |
|
|
* This method is used to tell which errors you expect to get. |
276 |
|
|
* Expected errors are always returned with error mode |
277 |
|
|
* PEAR_ERROR_RETURN. Expected error codes are stored in a stack, |
278 |
|
|
* and this method pushes a new element onto it. The list of |
279 |
|
|
* expected errors are in effect until they are popped off the |
280 |
|
|
* stack with the popExpect() method. |
281 |
|
|
* |
282 |
|
|
* @param mixed a single error code or an array of error codes |
283 |
|
|
* to expect |
284 |
|
|
* |
285 |
|
|
* @return int the new depth of the "expected errors" stack |
286 |
|
|
*/ |
287 |
|
|
function expectError($code = "*") |
288 |
|
|
{ |
289 |
|
|
if (is_array($code)) { |
290 |
|
|
array_push($this->_expected_errors, $code); |
291 |
|
|
} else { |
292 |
|
|
array_push($this->_expected_errors, array($code)); |
293 |
|
|
} |
294 |
|
|
return sizeof($this->_expected_errors); |
295 |
|
|
} |
296 |
|
|
|
297 |
|
|
// }}} |
298 |
|
|
// {{{ popExpect() |
299 |
|
|
|
300 |
|
|
/** |
301 |
|
|
* This method pops one element off the expected error codes |
302 |
|
|
* stack. |
303 |
|
|
* |
304 |
|
|
* @return array the list of error codes that were popped |
305 |
|
|
*/ |
306 |
|
|
function popExpect() |
307 |
|
|
{ |
308 |
|
|
return array_pop($this->_expected_errors); |
309 |
|
|
} |
310 |
|
|
|
311 |
|
|
// }}} |
312 |
|
|
// {{{ raiseError() |
313 |
|
|
|
314 |
|
|
/** |
315 |
|
|
* This method is a wrapper that returns an instance of the |
316 |
|
|
* configured error class with this object's default error |
317 |
|
|
* handling applied. If the $mode and $options parameters are not |
318 |
|
|
* specified, the object's defaults are used. |
319 |
|
|
* |
320 |
|
|
* @param $message a text error message or a PEAR error object |
321 |
|
|
* |
322 |
|
|
* @param $code a numeric error code (it is up to your class |
323 |
|
|
* to define these if you want to use codes) |
324 |
|
|
* |
325 |
|
|
* @param $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, |
326 |
|
|
* PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE or |
327 |
|
|
* PEAR_ERROR_CALLBACK. |
328 |
|
|
* |
329 |
|
|
* @param $options If $mode is PEAR_ERROR_TRIGGER, this parameter |
330 |
|
|
* specifies the PHP-internal error level (one of |
331 |
|
|
* E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). |
332 |
|
|
* If $mode is PEAR_ERROR_CALLBACK, this |
333 |
|
|
* parameter specifies the callback function or |
334 |
|
|
* method. In other error modes this parameter |
335 |
|
|
* is ignored. |
336 |
|
|
* |
337 |
|
|
* @param $userinfo If you need to pass along for example debug |
338 |
|
|
* information, this parameter is meant for that. |
339 |
|
|
* |
340 |
|
|
* @param $error_class The returned error object will be instantiated |
341 |
|
|
* from this class, if specified. |
342 |
|
|
* |
343 |
|
|
* @param $skipmsg If true, raiseError will only pass error codes, |
344 |
|
|
* the error message parameter will be dropped. |
345 |
|
|
* |
346 |
|
|
* @access public |
347 |
|
|
* @return object a PEAR error object |
348 |
|
|
* @see PEAR::setErrorHandling |
349 |
|
|
* @since PHP 4.0.5 |
350 |
|
|
*/ |
351 |
|
|
function &raiseError($message = null, |
352 |
|
|
$code = null, |
353 |
|
|
$mode = null, |
354 |
|
|
$options = null, |
355 |
|
|
$userinfo = null, |
356 |
|
|
$error_class = null, |
357 |
|
|
$skipmsg = false) |
358 |
|
|
{ |
359 |
|
|
// The error is yet a PEAR error object |
360 |
|
|
if (is_object($message)) { |
361 |
|
|
$code = $message->getCode(); |
362 |
|
|
$userinfo = $message->getUserInfo(); |
363 |
|
|
$error_class = $message->getType(); |
364 |
|
|
$message = $message->getMessage(); |
365 |
|
|
} |
366 |
|
|
|
367 |
|
|
if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { |
368 |
|
|
if ($exp[0] == "*" || |
369 |
|
|
(is_int(reset($exp)) && in_array($code, $exp)) || |
370 |
|
|
(is_string(reset($exp)) && in_array($message, $exp))) { |
371 |
|
|
$mode = PEAR_ERROR_RETURN; |
372 |
|
|
} |
373 |
|
|
} |
374 |
|
|
|
375 |
|
|
if ($mode === null) { |
376 |
|
|
if (isset($this) && isset($this->_default_error_mode)) { |
377 |
|
|
$mode = $this->_default_error_mode; |
378 |
|
|
} else { |
379 |
|
|
$mode = $GLOBALS['_PEAR_default_error_mode']; |
380 |
|
|
} |
381 |
|
|
} |
382 |
|
|
|
383 |
|
|
if ($mode == PEAR_ERROR_TRIGGER && $options === null) { |
384 |
|
|
if (isset($this)) { |
385 |
|
|
if (isset($this->_default_error_options)) { |
386 |
|
|
$options = $this->_default_error_options; |
387 |
|
|
} |
388 |
|
|
} else { |
389 |
|
|
$options = $GLOBALS['_PEAR_default_error_options']; |
390 |
|
|
} |
391 |
|
|
} |
392 |
|
|
|
393 |
|
|
if ($mode == PEAR_ERROR_CALLBACK) { |
394 |
|
|
if (!is_string($options) && |
395 |
|
|
!(is_array($options) && sizeof($options) == 2 && |
396 |
|
|
is_object($options[0]) && is_string($options[1]))) |
397 |
|
|
{ |
398 |
|
|
if (isset($this) && isset($this->_default_error_options)) { |
399 |
|
|
$options = $this->_default_error_options; |
400 |
|
|
} else { |
401 |
|
|
$options = $GLOBALS['_PEAR_default_error_options']; |
402 |
|
|
} |
403 |
|
|
} |
404 |
|
|
} else { |
405 |
|
|
if ($options === null) { |
406 |
|
|
if (isset($this)) { |
407 |
|
|
if (isset($this->_default_error_options)) { |
408 |
|
|
$options = $this->_default_error_options; |
409 |
|
|
} |
410 |
|
|
} else { |
411 |
|
|
$options = $GLOBALS['_PEAR_default_error_options']; |
412 |
|
|
} |
413 |
|
|
} |
414 |
|
|
} |
415 |
|
|
if ($error_class !== null) { |
416 |
|
|
$ec = $error_class; |
417 |
|
|
} elseif (isset($this) && isset($this->_error_class)) { |
418 |
|
|
$ec = $this->_error_class; |
419 |
|
|
} else { |
420 |
|
|
$ec = 'PEAR_Error'; |
421 |
|
|
} |
422 |
|
|
if ($skipmsg) { |
423 |
|
|
return new $ec($code, $mode, $options, $userinfo); |
424 |
|
|
} else { |
425 |
|
|
return new $ec($message, $code, $mode, $options, $userinfo); |
426 |
|
|
} |
427 |
|
|
} |
428 |
|
|
|
429 |
|
|
// }}} |
430 |
|
|
// {{{ pushErrorHandling() |
431 |
|
|
|
432 |
|
|
/** |
433 |
|
|
* Push a new error handler on top of the error handler options stack. With this |
434 |
|
|
* you can easily override the actual error handler for some code and restore |
435 |
|
|
* it later with popErrorHandling. |
436 |
|
|
* |
437 |
|
|
* @param $mode mixed (same as setErrorHandling) |
438 |
|
|
* @param $options mixed (same as setErrorHandling) |
439 |
|
|
* |
440 |
|
|
* @return bool Always true |
441 |
|
|
* |
442 |
|
|
* @see PEAR::setErrorHandling |
443 |
|
|
*/ |
444 |
|
|
function pushErrorHandling($mode, $options = null) |
445 |
|
|
{ |
446 |
|
|
$stack = &$GLOBALS['_PEAR_error_handler_stack']; |
447 |
|
|
if (!is_array($stack)) { |
448 |
|
|
if (isset($this)) { |
449 |
|
|
$def_mode = &$this->_default_error_mode; |
450 |
|
|
$def_options = &$this->_default_error_options; |
451 |
|
|
// XXX Used anywhere? |
452 |
|
|
//$def_callback = &$this->_default_error_callback; |
453 |
|
|
} else { |
454 |
|
|
$def_mode = &$GLOBALS['_PEAR_default_error_mode']; |
455 |
|
|
$def_options = &$GLOBALS['_PEAR_default_error_options']; |
456 |
|
|
// XXX Used anywhere? |
457 |
|
|
//$def_callback = &$GLOBALS['_PEAR_default_error_callback']; |
458 |
|
|
} |
459 |
|
|
$stack = array(); |
460 |
|
|
$stack[] = array($def_mode, $def_options); |
461 |
|
|
} |
462 |
|
|
|
463 |
|
|
if (isset($this)) { |
464 |
|
|
$this->setErrorHandling($mode, $options); |
465 |
|
|
} else { |
466 |
|
|
PEAR::setErrorHandling($mode, $options); |
467 |
|
|
} |
468 |
|
|
$stack[] = array($mode, $options); |
469 |
|
|
return true; |
470 |
|
|
} |
471 |
|
|
|
472 |
|
|
// }}} |
473 |
|
|
// {{{ popErrorHandling() |
474 |
|
|
|
475 |
|
|
/** |
476 |
|
|
* Pop the last error handler used |
477 |
|
|
* |
478 |
|
|
* @return bool Always true |
479 |
|
|
* |
480 |
|
|
* @see PEAR::pushErrorHandling |
481 |
|
|
*/ |
482 |
|
|
function popErrorHandling() |
483 |
|
|
{ |
484 |
|
|
$stack = &$GLOBALS['_PEAR_error_handler_stack']; |
485 |
|
|
array_pop($stack); |
486 |
|
|
list($mode, $options) = $stack[sizeof($stack) - 1]; |
487 |
|
|
if (isset($this)) { |
488 |
|
|
$this->setErrorHandling($mode, $options); |
489 |
|
|
} else { |
490 |
|
|
PEAR::setErrorHandling($mode, $options); |
491 |
|
|
} |
492 |
|
|
return true; |
493 |
|
|
} |
494 |
|
|
|
495 |
|
|
// }}} |
496 |
|
|
} |
497 |
|
|
|
498 |
|
|
// {{{ _PEAR_call_destructors() |
499 |
|
|
|
500 |
|
|
function _PEAR_call_destructors() |
501 |
|
|
{ |
502 |
|
|
global $_PEAR_destructor_object_list; |
503 |
|
|
if (is_array($_PEAR_destructor_object_list) && |
504 |
|
|
sizeof($_PEAR_destructor_object_list)) |
505 |
|
|
{ |
506 |
|
|
reset($_PEAR_destructor_object_list); |
507 |
|
|
while (list($k, $objref) = each($_PEAR_destructor_object_list)) { |
508 |
|
|
$classname = get_class($objref); |
509 |
|
|
while ($classname) { |
510 |
|
|
$destructor = "_$classname"; |
511 |
|
|
if (method_exists($objref, $destructor)) { |
512 |
|
|
$objref->$destructor(); |
513 |
|
|
break; |
514 |
|
|
} else { |
515 |
|
|
$classname = get_parent_class($classname); |
516 |
|
|
} |
517 |
|
|
} |
518 |
|
|
} |
519 |
|
|
// Empty the object list to ensure that destructors are |
520 |
|
|
// not called more than once. |
521 |
|
|
$_PEAR_destructor_object_list = array(); |
522 |
|
|
} |
523 |
|
|
} |
524 |
|
|
|
525 |
|
|
// }}} |
526 |
|
|
|
527 |
|
|
class PEAR_Error |
528 |
|
|
{ |
529 |
|
|
// {{{ properties |
530 |
|
|
|
531 |
|
|
var $error_message_prefix = ''; |
532 |
|
|
var $mode = PEAR_ERROR_RETURN; |
533 |
|
|
var $level = E_USER_NOTICE; |
534 |
|
|
var $code = -1; |
535 |
|
|
var $message = ''; |
536 |
|
|
var $userinfo = ''; |
537 |
|
|
|
538 |
|
|
// Wait until we have a stack-groping function in PHP. |
539 |
|
|
//var $file = ''; |
540 |
|
|
//var $line = 0; |
541 |
|
|
|
542 |
|
|
|
543 |
|
|
// }}} |
544 |
|
|
// {{{ constructor |
545 |
|
|
|
546 |
|
|
/** |
547 |
|
|
* PEAR_Error constructor |
548 |
|
|
* |
549 |
|
|
* @param $message error message |
550 |
|
|
* |
551 |
|
|
* @param $code (optional) error code |
552 |
|
|
* |
553 |
|
|
* @param $mode (optional) error mode, one of: PEAR_ERROR_RETURN, |
554 |
|
|
* PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER or |
555 |
|
|
* PEAR_ERROR_CALLBACK |
556 |
|
|
* |
557 |
|
|
* @param $level (optional) error level, _OR_ in the case of |
558 |
|
|
* PEAR_ERROR_CALLBACK, the callback function or object/method |
559 |
|
|
* tuple. |
560 |
|
|
* |
561 |
|
|
* @access public |
562 |
|
|
* |
563 |
|
|
*/ |
564 |
|
|
function PEAR_Error($message = 'unknown error', $code = null, |
565 |
|
|
$mode = null, $options = null, $userinfo = null) |
566 |
|
|
{ |
567 |
|
|
if ($mode === null) { |
568 |
|
|
$mode = PEAR_ERROR_RETURN; |
569 |
|
|
} |
570 |
|
|
$this->message = $message; |
571 |
|
|
$this->code = $code; |
572 |
|
|
$this->mode = $mode; |
573 |
|
|
$this->userinfo = $userinfo; |
574 |
|
|
if ($mode & PEAR_ERROR_CALLBACK) { |
575 |
|
|
$this->level = E_USER_NOTICE; |
576 |
|
|
$this->callback = $options; |
577 |
|
|
} else { |
578 |
|
|
if ($options === null) { |
579 |
|
|
$options = E_USER_NOTICE; |
580 |
|
|
} |
581 |
|
|
$this->level = $options; |
582 |
|
|
$this->callback = null; |
583 |
|
|
} |
584 |
|
|
if ($this->mode & PEAR_ERROR_PRINT) { |
585 |
|
|
if (is_null($options) || is_int($options)) { |
586 |
|
|
$format = "%s"; |
587 |
|
|
} else { |
588 |
|
|
$format = $options; |
589 |
|
|
} |
590 |
|
|
printf($format, $this->getMessage()); |
591 |
|
|
} |
592 |
|
|
if ($this->mode & PEAR_ERROR_TRIGGER) { |
593 |
|
|
trigger_error($this->getMessage(), $this->level); |
594 |
|
|
} |
595 |
|
|
if ($this->mode & PEAR_ERROR_DIE) { |
596 |
|
|
$msg = $this->getMessage(); |
597 |
|
|
if (is_null($options) || is_int($options)) { |
598 |
|
|
$format = "%s"; |
599 |
|
|
if (substr($msg, -1) != "\n") { |
600 |
|
|
$msg .= "\n"; |
601 |
|
|
} |
602 |
|
|
} else { |
603 |
|
|
$format = $options; |
604 |
|
|
} |
605 |
|
|
die(sprintf($format, $msg)); |
606 |
|
|
} |
607 |
|
|
if ($this->mode & PEAR_ERROR_CALLBACK) { |
608 |
|
|
if (is_string($this->callback) && strlen($this->callback)) { |
609 |
|
|
call_user_func($this->callback, $this); |
610 |
|
|
} elseif (is_array($this->callback) && |
611 |
|
|
sizeof($this->callback) == 2 && |
612 |
|
|
is_object($this->callback[0]) && |
613 |
|
|
is_string($this->callback[1]) && |
614 |
|
|
strlen($this->callback[1])) { |
615 |
|
|
@call_user_method($this->callback[1], $this->callback[0], |
616 |
|
|
$this); |
617 |
|
|
} |
618 |
|
|
} |
619 |
|
|
} |
620 |
|
|
|
621 |
|
|
// }}} |
622 |
|
|
// {{{ getMode() |
623 |
|
|
|
624 |
|
|
/** |
625 |
|
|
* Get the error mode from an error object. |
626 |
|
|
* |
627 |
|
|
* @return int error mode |
628 |
|
|
* @access public |
629 |
|
|
*/ |
630 |
|
|
function getMode() { |
631 |
|
|
return $this->mode; |
632 |
|
|
} |
633 |
|
|
|
634 |
|
|
// }}} |
635 |
|
|
// {{{ getCallback() |
636 |
|
|
|
637 |
|
|
/** |
638 |
|
|
* Get the callback function/method from an error object. |
639 |
|
|
* |
640 |
|
|
* @return mixed callback function or object/method array |
641 |
|
|
* @access public |
642 |
|
|
*/ |
643 |
|
|
function getCallback() { |
644 |
|
|
return $this->callback; |
645 |
|
|
} |
646 |
|
|
|
647 |
|
|
// }}} |
648 |
|
|
// {{{ getMessage() |
649 |
|
|
|
650 |
|
|
|
651 |
|
|
/** |
652 |
|
|
* Get the error message from an error object. |
653 |
|
|
* |
654 |
|
|
* @return string full error message |
655 |
|
|
* @access public |
656 |
|
|
*/ |
657 |
|
|
function getMessage () |
658 |
|
|
{ |
659 |
|
|
return ($this->error_message_prefix . $this->message); |
660 |
|
|
} |
661 |
|
|
|
662 |
|
|
|
663 |
|
|
// }}} |
664 |
|
|
// {{{ getCode() |
665 |
|
|
|
666 |
|
|
/** |
667 |
|
|
* Get error code from an error object |
668 |
|
|
* |
669 |
|
|
* @return int error code |
670 |
|
|
* @access public |
671 |
|
|
*/ |
672 |
|
|
function getCode() |
673 |
|
|
{ |
674 |
|
|
return $this->code; |
675 |
|
|
} |
676 |
|
|
|
677 |
|
|
// }}} |
678 |
|
|
// {{{ getType() |
679 |
|
|
|
680 |
|
|
/** |
681 |
|
|
* Get the name of this error/exception. |
682 |
|
|
* |
683 |
|
|
* @return string error/exception name (type) |
684 |
|
|
* @access public |
685 |
|
|
*/ |
686 |
|
|
function getType () |
687 |
|
|
{ |
688 |
|
|
return get_class($this); |
689 |
|
|
} |
690 |
|
|
|
691 |
|
|
// }}} |
692 |
|
|
// {{{ getUserInfo() |
693 |
|
|
|
694 |
|
|
/** |
695 |
|
|
* Get additional user-supplied information. |
696 |
|
|
* |
697 |
|
|
* @return string user-supplied information |
698 |
|
|
* @access public |
699 |
|
|
*/ |
700 |
|
|
function getUserInfo () |
701 |
|
|
{ |
702 |
|
|
return $this->userinfo; |
703 |
|
|
} |
704 |
|
|
|
705 |
|
|
// }}} |
706 |
|
|
// {{{ getDebugInfo() |
707 |
|
|
|
708 |
|
|
/** |
709 |
|
|
* Get additional debug information supplied by the application. |
710 |
|
|
* |
711 |
|
|
* @return string debug information |
712 |
|
|
* @access public |
713 |
|
|
*/ |
714 |
|
|
function getDebugInfo () |
715 |
|
|
{ |
716 |
|
|
return $this->getUserInfo(); |
717 |
|
|
} |
718 |
|
|
|
719 |
|
|
// }}} |
720 |
|
|
// {{{ addUserInfo() |
721 |
|
|
|
722 |
|
|
function addUserInfo($info) |
723 |
|
|
{ |
724 |
|
|
if (empty($this->userinfo)) { |
725 |
|
|
$this->userinfo = $info; |
726 |
|
|
} else { |
727 |
|
|
$this->userinfo .= " ** $info"; |
728 |
|
|
} |
729 |
|
|
} |
730 |
|
|
|
731 |
|
|
// }}} |
732 |
|
|
// {{{ toString() |
733 |
|
|
|
734 |
|
|
/** |
735 |
|
|
* Make a string representation of this object. |
736 |
|
|
* |
737 |
|
|
* @return string a string with an object summary |
738 |
|
|
* @access public |
739 |
|
|
*/ |
740 |
|
|
function toString() { |
741 |
|
|
$modes = array(); |
742 |
|
|
$levels = array(E_USER_NOTICE => 'notice', |
743 |
|
|
E_USER_WARNING => 'warning', |
744 |
|
|
E_USER_ERROR => 'error'); |
745 |
|
|
if ($this->mode & PEAR_ERROR_CALLBACK) { |
746 |
|
|
if (is_array($this->callback)) { |
747 |
|
|
$callback = get_class($this->callback[0]) . '::' . |
748 |
|
|
$this->callback[1]; |
749 |
|
|
} else { |
750 |
|
|
$callback = $this->callback; |
751 |
|
|
} |
752 |
|
|
return sprintf('[%s: message="%s" code=%d mode=callback '. |
753 |
|
|
'callback=%s prefix="%s" info="%s"]', |
754 |
|
|
get_class($this), $this->message, $this->code, |
755 |
|
|
$callback, $this->error_message_prefix, |
756 |
|
|
$this->userinfo); |
757 |
|
|
} |
758 |
|
|
if ($this->mode & PEAR_ERROR_CALLBACK) { |
759 |
|
|
$modes[] = 'callback'; |
760 |
|
|
} |
761 |
|
|
if ($this->mode & PEAR_ERROR_PRINT) { |
762 |
|
|
$modes[] = 'print'; |
763 |
|
|
} |
764 |
|
|
if ($this->mode & PEAR_ERROR_TRIGGER) { |
765 |
|
|
$modes[] = 'trigger'; |
766 |
|
|
} |
767 |
|
|
if ($this->mode & PEAR_ERROR_DIE) { |
768 |
|
|
$modes[] = 'die'; |
769 |
|
|
} |
770 |
|
|
if ($this->mode & PEAR_ERROR_RETURN) { |
771 |
|
|
$modes[] = 'return'; |
772 |
|
|
} |
773 |
|
|
return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. |
774 |
|
|
'prefix="%s" info="%s"]', |
775 |
|
|
get_class($this), $this->message, $this->code, |
776 |
|
|
implode("|", $modes), $levels[$this->level], |
777 |
|
|
$this->error_message_prefix, |
778 |
|
|
$this->userinfo); |
779 |
|
|
} |
780 |
|
|
|
781 |
|
|
// }}} |
782 |
|
|
} |
783 |
|
|
|
784 |
|
|
register_shutdown_function("_PEAR_call_destructors"); |
785 |
|
|
|
786 |
|
|
/* |
787 |
|
|
* Local Variables: |
788 |
|
|
* mode: php |
789 |
|
|
* tab-width: 4 |
790 |
|
|
* c-basic-offset: 4 |
791 |
|
|
* End: |
792 |
|
|
*/ |
793 |
|
|
?> |