PEAR.php源代码

阅读更多

 

  1. /**
  2.  * PEAR, the PHP Extension and Application Repository
  3.  *
  4.  * PEAR class and PEAR_Error class
  5.  *
  6.  * PHP versions 4 and 5
  7.  *
  8.  * LICENSE: This source file is subject to version 3.0 of the PHP license
  9.  * that is available through the world-wide-web at the following URI:
  10.  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  11.  * the PHP License and are unable to obtain it through the web, please
  12.  * send a note to [email protected] so we can mail you a copy immediately.
  13.  *
  14.  * @category   pear
  15.  * @package    PEAR
  16.  * @author     Sterling Hughes
  17.  * @author     Stig Bakken
  18.  * @author     Tomas V.V.Cox
  19.  * @author     Greg Beaver
  20.  * @copyright  1997-2008 The PHP Group
  21.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  22.  * @version    CVS: $Id: PEAR.php 2832 2008-07-24 02:27:18Z mevans0263 $
  23.  * @link       http://pear.php.net/package/PEAR
  24.  * @since      File available since Release 0.1
  25.  */
  26.  
  27. /**#@+
  28.  * ERROR constants
  29.  */
  30. define ( 'PEAR_ERROR_RETURN' ,      1 ) ;
  31. define ( 'PEAR_ERROR_PRINT' ,       2 ) ;
  32. define ( 'PEAR_ERROR_TRIGGER' ,     4 ) ;
  33. define ( 'PEAR_ERROR_DIE' ,         8 ) ;
  34. define ( 'PEAR_ERROR_CALLBACK' ,   16 ) ;
  35. /**
  36.  * WARNING: obsolete
  37.  * @deprecated
  38.  */
  39. define ( 'PEAR_ERROR_EXCEPTION' ,  32 ) ;
  40. /**#@-*/
  41. define ( 'PEAR_ZE2' ,  ( function_exists ( 'version_compare' )  &&
  42.                      version_compare ( zend_version ( ) ,  "2-dev" ,  "ge" ) ) ) ;
  43.  
  44. if  ( substr ( PHP_OS ,  0 ,  3 )  ==  'WIN' )  {
  45.      define ( 'OS_WINDOWS' ,  true ) ;
  46.      define ( 'OS_UNIX' ,     false ) ;
  47.      define ( 'PEAR_OS' ,     'Windows' ) ;
  48. }  else  {
  49.      define ( 'OS_WINDOWS' ,  false ) ;
  50.      define ( 'OS_UNIX' ,     true ) ;
  51.      define ( 'PEAR_OS' ,     'Unix' ) ;  // blatant assumption
  52. }
  53.  
  54. // instant backwards compatibility
  55. if  ( ! defined ( 'PATH_SEPARATOR' ) )  {
  56.      if  (OS_WINDOWS )  {
  57.          define ( 'PATH_SEPARATOR' ,  ';' ) ;
  58.      }  else  {
  59.          define ( 'PATH_SEPARATOR' ,  ':' ) ;
  60.      }
  61. }
  62.  
  63. $GLOBALS [ '_PEAR_default_error_mode' ]      = PEAR_ERROR_RETURN ;
  64. $GLOBALS [ '_PEAR_default_error_options' ]   =  E_USER_NOTICE ;
  65. $GLOBALS [ '_PEAR_destructor_object_list' ]  =  array ( ) ;
  66. $GLOBALS [ '_PEAR_shutdown_funcs' ]          =  array ( ) ;
  67. $GLOBALS [ '_PEAR_error_handler_stack' ]     =  array ( ) ;
  68.  
  69. @ ini_set ( 'track_errors' ,  true ) ;
  70.  
  71. /**
  72.  * Base class for other PEAR classes.  Provides rudimentary
  73.  * emulation of destructors.
  74.  *
  75.  * If you want a destructor in your class, inherit PEAR and make a
  76.  * destructor method called _yourclassname (same name as the
  77.  * constructor, but with a "_" prefix).  Also, in your constructor you
  78.  * have to call the PEAR constructor: $this->PEAR();.
  79.  * The destructor method will be called without parameters.  Note that
  80.  * at in some SAPI implementations (such as Apache), any output during
  81.  * the request shutdown (in which destructors are called) seems to be
  82.  * discarded.  If you need to get any debug information from your
  83.  * destructor, use error_log(), syslog() or something similar.
  84.  *
  85.  * IMPORTANT! To use the emulated destructors you need to create the
  86.  * objects by reference: $obj =& new PEAR_child;
  87.  *
  88.  * @category   pear
  89.  * @package    PEAR
  90.  * @author     Stig Bakken
  91.  * @author     Tomas V.V. Cox
  92.  * @author     Greg Beaver
  93.  * @copyright  1997-2006 The PHP Group
  94.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  95.  * @version    Release: 1.7.2
  96.  * @link       http://pear.php.net/package/PEAR
  97.  * @see        PEAR_Error
  98.  * @since      Class available since PHP 4.0.2
  99.  * @link        http://pear.php.net/manual/en/core.pear.php#core.pear.pear
  100.  */
  101. class PEAR
  102. {
  103.      // {{{ properties
  104.  
  105.      /**
  106.      * Whether to enable internal debug messages.
  107.      *
  108.      * @var     bool
  109.      * @access  private
  110.      */
  111.      var  $_debug  =  false ;
  112.  
  113.      /**
  114.      * Default error mode for this object.
  115.      *
  116.      * @var     int
  117.      * @access  private
  118.      */
  119.      var  $_default_error_mode  =  null ;
  120.  
  121.      /**
  122.      * Default error options used for this object when error mode
  123.      * is PEAR_ERROR_TRIGGER.
  124.      *
  125.      * @var     int
  126.      * @access  private
  127.      */
  128.      var  $_default_error_options  =  null ;
  129.  
  130.      /**
  131.      * Default error handler (callback) for this object, if error mode is
  132.      * PEAR_ERROR_CALLBACK.
  133.      *
  134.      * @var     string
  135.      * @access  private
  136.      */
  137.      var  $_default_error_handler  =  '' ;
  138.  
  139.      /**
  140.      * Which class to use for error objects.
  141.      *
  142.      * @var     string
  143.      * @access  private
  144.      */
  145.      var  $_error_class  =  'PEAR_Error' ;
  146.  
  147.      /**
  148.      * An array of expected errors.
  149.      *
  150.      * @var     array
  151.      * @access  private
  152.      */
  153.      var  $_expected_errors  =  array ( ) ;
  154.  
  155.      // }}}
  156.  
  157.      // {{{ constructor
  158.  
  159.      /**
  160.      * Constructor.  Registers this object in
  161.      * $_PEAR_destructor_object_list for destructor emulation if a
  162.      * destructor object exists.
  163.      *
  164.      * @param string $error_class  (optional) which class to use for
  165.      *        error objects, defaults to PEAR_Error.
  166.      * @access public
  167.      * @return void
  168.      */
  169.      function PEAR ( $error_class  =  null )
  170.      {
  171.          $classname  =  strtolower ( get_class ( $this ) ) ;
  172.          if  ( $this ->_debug )  {
  173.              print  "PEAR constructor called, class=$classname\n" ;
  174.          }
  175.          if  ( $error_class  !==  null )  {
  176.              $this ->_error_class  =  $error_class ;
  177.          }
  178.          while  ( $classname  &&  strcasecmp ( $classname ,  "pear" ) )  {
  179.              $destructor  =  "_$classname" ;
  180.              if  ( method_exists ( $this ,  $destructor ) )  {
  181.                  global  $_PEAR_destructor_object_list ;
  182.                  $_PEAR_destructor_object_list [ ]  =  & $this ;
  183.                  if  ( ! isset ( $GLOBALS [ '_PEAR_SHUTDOWN_REGISTERED' ] ) )  {
  184.                      register_shutdown_function ( "_PEAR_call_destructors" ) ;
  185.                      $GLOBALS [ '_PEAR_SHUTDOWN_REGISTERED' ]  =  true ;
  186.                  }
  187.                  break ;
  188.              }  else  {
  189.                  $classname  =  get_parent_class ( $classname ) ;
  190.              }
  191.          }
  192.      }
  193.  
  194.      // }}}
  195.      // {{{ destructor
  196.  
  197.      /**
  198.      * Destructor (the emulated type of...).  Does nothing right now,
  199.      * but is included for forward compatibility, so subclass
  200.      * destructors should always call it.
  201.      *
  202.      * See the note in the class desciption about output from
  203.      * destructors.
  204.      *
  205.      * @access public
  206.      * @return void
  207.      */
  208.      function _PEAR ( )  {
  209.          if  ( $this ->_debug )  {
  210.              printf ( "PEAR destructor called, class=%s\n" ,  strtolower ( get_class ( $this ) ) ) ;
  211.          }
  212.      }
  213.  
  214.      // }}}
  215.      // {{{ getStaticProperty()
  216.  
  217.      /**
  218.     * If you have a class that's mostly/entirely static, and you need static
  219.     * properties, you can use this method to simulate them. Eg. in your method(s)
  220.     * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
  221.     * You MUST use a reference, or they will not persist!
  222.     *
  223.     * @access public
  224.     * @param  string $class  The calling classname, to prevent clashes
  225.     * @param  string $var    The variable to retrieve.
  226.     * @return mixed   A reference to the variable. If not set it will be
  227.     *                 auto initialised to NULL.
  228.     */
  229.      function  &getStaticProperty ( $class ,  $var )
  230.      {
  231.         static  $properties ;
  232.          if  ( ! isset ( $properties [ $class ] ) )  {
  233.              $properties [ $class ]  =  array ( ) ;
  234.          }
  235.          if  ( ! array_key_exists ( $var ,  $properties [ $class ] ) )  {
  236.              $properties [ $class ] [ $var ]  =  null ;
  237.          }
  238.          return  $properties [ $class ] [ $var ] ;
  239.      }
  240.  
  241.      // }}}
  242.      // {{{ registerShutdownFunc()
  243.  
  244.      /**
  245.     * Use this function to register a shutdown method for static
  246.     * classes.
  247.     *
  248.     * @access public
  249.     * @param  mixed $func  The function name (or array of class/method) to call
  250.     * @param  mixed $args  The arguments to pass to the function
  251.     * @return void
  252.     */
  253.      function registerShutdownFunc ( $func ,  $args  =  array ( ) )
  254.      {
  255.          // if we are called statically, there is a potential
  256.          // that no shutdown func is registered.  Bug #6445
  257.          if  ( ! isset ( $GLOBALS [ '_PEAR_SHUTDOWN_REGISTERED' ] ) )  {
  258.              register_shutdown_function ( "_PEAR_call_destructors" ) ;
  259.              $GLOBALS [ '_PEAR_SHUTDOWN_REGISTERED' ]  =  true ;
  260.          }
  261.          $GLOBALS [ '_PEAR_shutdown_funcs' ] [ ]  =  array ( $func ,  $args ) ;
  262.      }
  263.  
  264.      // }}}
  265.      // {{{ isError()
  266.  
  267.      /**
  268.      * Tell whether a value is a PEAR error.
  269.      *
  270.      * @param   mixed $data   the value to test
  271.      * @param   int   $code   if $data is an error object, return true
  272.      *                        only if $code is a string and
  273.      *                        $obj->getMessage() == $code or
  274.      *                        $code is an integer and $obj->getCode() == $code
  275.      * @access  public
  276.      * @return  bool    true if parameter is an error
  277.      */
  278.      function isError ( $data ,  $code  =  null )
  279.      {
  280.          if  ( is_a ( $data ,  'PEAR_Error' ) )  {
  281.              if  ( is_null ( $code ) )  {
  282.                  return  true ;
  283.              }  elseif  ( is_string ( $code ) )  {
  284.                  return  $data -> getMessage ( )  ==  $code ;
  285.              }  else  {
  286.                  return  $data -> getCode ( )  ==  $code ;
  287.              }
  288.          }
  289.          return  false ;
  290.      }
  291.  
  292.      // }}}
  293.      // {{{ setErrorHandling()
  294.  
  295.      /**
  296.      * Sets how errors generated by this object should be handled.
  297.      * Can be invoked both in objects and statically.  If called
  298.      * statically, setErrorHandling sets the default behaviour for all
  299.      * PEAR objects.  If called in an object, setErrorHandling sets
  300.      * the default behaviour for that object.
  301.      *
  302.      * @param int $mode
  303.      *        One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
  304.      *        PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
  305.      *        PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
  306.      *
  307.      * @param mixed $options
  308.      *        When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
  309.      *        of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
  310.      *
  311.      *        When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
  312.      *        to be the callback function or method.  A callback
  313.      *        function is a string with the name of the function, a
  314.      *        callback method is an array of two elements: the element
  315.      *        at index 0 is the object, and the element at index 1 is
  316.      *        the name of the method to call in the object.
  317.      *
  318.      *        When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
  319.      *        a printf format string used when printing the error
  320.      *        message.
  321.      *
  322.      * @access public
  323.      * @return void
  324.      * @see PEAR_ERROR_RETURN
  325.      * @see PEAR_ERROR_PRINT
  326.      * @see PEAR_ERROR_TRIGGER
  327.      * @see PEAR_ERROR_DIE
  328.      * @see PEAR_ERROR_CALLBACK
  329.      * @see PEAR_ERROR_EXCEPTION
  330.      *
  331.      * @since PHP 4.0.5
  332.      */
  333.  
  334.      function setErrorHandling ( $mode  =  null ,  $options  =  null )
  335.      {
  336.          if  ( isset ( $this )  &&  is_a ( $this ,  'PEAR' ) )  {
  337.              $setmode      =  & $this ->_default_error_mode ;
  338.              $setoptions   =  & $this ->_default_error_options ;
  339.          }  else  {
  340.              $setmode      =  & $GLOBALS [ '_PEAR_default_error_mode' ] ;
  341.              $setoptions   =  & $GLOBALS [ '_PEAR_default_error_options' ] ;
  342.          }
  343.  
  344.          switch  ( $mode )  {
  345.              case PEAR_ERROR_EXCEPTION :
  346.              case PEAR_ERROR_RETURN :
  347.              case PEAR_ERROR_PRINT :
  348.              case PEAR_ERROR_TRIGGER :
  349.              case PEAR_ERROR_DIE :
  350.              case  null :
  351.                  $setmode  =  $mode ;
  352.                  $setoptions  =  $options ;
  353.                  break ;
  354.  
  355.              case PEAR_ERROR_CALLBACK :
  356.                  $setmode  =  $mode ;
  357.                  // class/object method callback
  358.                  if  ( is_callable ( $options ) )  {
  359.                      $setoptions  =  $options ;
  360.                  }  else  {
  361.                      trigger_error ( "invalid error callback" ,  E_USER_WARNING ) ;
  362.                  }
  363.                  break ;
  364.  
  365.              default :
  366.                  trigger_error ( "invalid error mode" ,  E_USER_WARNING ) ;
  367.                  break ;
  368.          }
  369.      }
  370.  
  371.      // }}}
  372.      // {{{ expectError()
  373.  
  374.      /**
  375.      * This method is used to tell which errors you expect to get.
  376.      * Expected errors are always returned with error mode
  377.      * PEAR_ERROR_RETURN.  Expected error codes are stored in a stack,
  378.      * and this method pushes a new element onto it.  The list of
  379.      * expected errors are in effect until they are popped off the
  380.      * stack with the popExpect() method.
  381.      *
  382.      * Note that this method can not be called statically
  383.      *
  384.      * @param mixed $code a single error code or an array of error codes to expect
  385.      *
  386.      * @return int     the new depth of the "expected errors" stack
  387.      * @access public
  388.      */
  389.      function expectError ( $code  =  '*' )
  390.      {
  391.          if  ( is_array ( $code ) )  {
  392.              array_push ( $this ->_expected_errors ,  $code ) ;
  393.          }  else  {
  394.              array_push ( $this ->_expected_errors ,  array ( $code ) ) ;
  395.          }
  396.          return  sizeof ( $this ->_expected_errors ) ;
  397.      }
  398.  
  399.      // }}}
  400.      // {{{ popExpect()
  401.  
  402.      /**
  403.      * This method pops one element off the expected error codes
  404.      * stack.
  405.      *
  406.      * @return array   the list of error codes that were popped
  407.      */
  408.      function popExpect ( )
  409.      {
  410.          return  array_pop ( $this ->_expected_errors ) ;
  411.      }
  412.  
  413.      // }}}
  414.      // {{{ _checkDelExpect()
  415.  
  416.      /**
  417.      * This method checks unsets an error code if available
  418.      *
  419.      * @param mixed error code
  420.      * @return bool true if the error code was unset, false otherwise
  421.      * @access private
  422.      * @since PHP 4.3.0
  423.      */
  424.      function _checkDelExpect ( $error_code )
  425.      {
  426.          $deleted  =  false ;
  427.  
  428.          foreach  ( $this ->_expected_errors  AS  $key  =>  $error_array )  {
  429.              if  ( in_array ( $error_code ,  $error_array ) )  {
  430.                  unset ( $this ->_expected_errors [ $key ] [ array_search ( $error_code ,  $error_array ) ] ) ;
  431.                  $deleted  =  true ;
  432.              }
  433.  
  434.              // clean up empty arrays
  435.              if  ( 0  ==  count ( $this ->_expected_errors [ $key ] ) )  {
  436.                  unset ( $this ->_expected_errors [ $key ] ) ;
  437.              }
  438.          }
  439.          return  $deleted ;
  440.      }
  441.  
  442.      // }}}
  443.      // {{{ delExpect()
  444.  
  445.      /**
  446.      * This method deletes all occurences of the specified element from
  447.      * the expected error codes stack.
  448.      *
  449.      * @param  mixed $error_code error code that should be deleted
  450.      * @return mixed list of error codes that were deleted or error
  451.      * @access public
  452.      * @since PHP 4.3.0
  453.      */
  454.      function delExpect ( $error_code )
  455.      {
  456.          $deleted  =  false ;
  457.  
  458.          if  ( ( is_array ( $error_code )  &&  ( 0  !=  count ( $error_code ) ) ) )  {
  459.              // $error_code is a non-empty array here;
  460.              // we walk through it trying to unset all
  461.              // values
  462.              foreach ( $error_code  as  $key  =>  $error )  {
  463.                  if  ( $this ->_checkDelExpect ( $error ) )  {
  464.                      $deleted  =   true ;
  465.                  }  else  {
  466.                      $deleted  =  false ;
  467.                  }
  468.              }
  469.              return  $deleted ?  true  : PEAR :: raiseError ( "The expected error you submitted does not exist" ) ;  // IMPROVE ME
  470.          }  elseif  ( ! empty ( $error_code ) )  {
  471.              // $error_code comes alone, trying to unset it
  472.              if  ( $this ->_checkDelExpect ( $error_code ) )  {
  473.                  return  true ;
  474.              }  else  {
  475.                  return PEAR :: raiseError ( "The expected error you submitted does not exist" ) ;  // IMPROVE ME
  476.              }
  477.          }  else  {
  478.              // $error_code is empty
  479.              return PEAR :: raiseError ( "The expected error you submitted is empty" ) ;  // IMPROVE ME
  480.          }
  481.      }
  482.  
  483.      // }}}
  484.      // {{{ raiseError()
  485.  
  486.      /**
  487.      * This method is a wrapper that returns an instance of the
  488.      * configured error class with this object's default error
  489.      * handling applied.  If the $mode and $options parameters are not
  490.      * specified, the object's defaults are used.
  491.      *
  492.      * @param mixed $message a text error message or a PEAR error object
  493.      *
  494.      * @param int $code      a numeric error code (it is up to your class
  495.      *                  to define these if you want to use codes)
  496.      *
  497.      * @param int $mode      One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
  498.      *                  PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
  499.      *                  PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
  500.      *
  501.      * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
  502.      *                  specifies the PHP-internal error level (one of
  503.      *                  E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
  504.      *                  If $mode is PEAR_ERROR_CALLBACK, this
  505.      *                  parameter specifies the callback function or
  506.      *                  method.  In other error modes this parameter
  507.      *                  is ignored.
  508.      *
  509.      * @param string $userinfo If you need to pass along for example debug
  510.      *                  information, this parameter is meant for that.
  511.      *
  512.      * @param string $error_class The returned error object will be
  513.      *                  instantiated from this class, if specified.
  514.      *
  515.      * @param bool $skipmsg If true, raiseError will only pass error codes,
  516.      *                  the error message parameter will be dropped.
  517.      *
  518.      * @access public
  519.      * @return object   a PEAR error object
  520.      * @see PEAR::setErrorHandling
  521.      * @since PHP 4.0.5
  522.      */
  523.      function  &raiseError ( $message  =  null ,
  524.                           $code  =  null ,
  525.                           $mode  =  null ,
  526.                           $options  =  null ,
  527.                           $userinfo  =  null ,
  528.                           $error_class  =  null ,
  529.                           $skipmsg  =  false )
  530.      {
  531.          // The error is yet a PEAR error object
  532.          if  ( is_object ( $message ) )  {
  533.              $code         =  $message -> getCode ( ) ;
  534.              $userinfo     =  $message -> getUserInfo ( ) ;
  535.              $error_class  =  $message -> getType ( ) ;
  536.              $message -> error_message_prefix  =  '' ;
  537.              $message      =  $message -> getMessage ( ) ;
  538.          }
  539.  
  540.          if  ( isset ( $this )  &&  isset ( $this ->_expected_errors )  &&  sizeof ( $this ->_expected_errors )  >  0  &&  sizeof ( $exp  =  end ( $this ->_expected_errors ) ) )  {
  541.              if  ( $exp [ 0 ]  ==  "*"  ||
  542.                  ( is_int ( reset ( $exp ) )  &&  in_array ( $code ,  $exp ) )  ||
  543.                  ( is_string ( reset ( $exp ) )  &&  in_array ( $message ,  $exp ) ) )  {
  544.                  $mode  = PEAR_ERROR_RETURN ;
  545.              }
  546.          }
  547.          // No mode given, try global ones
  548.          if  ( $mode  ===  null )  {
  549.              // Class error handler
  550.              if  ( isset ( $this )  &&  isset ( $this ->_default_error_mode ) )  {
  551.                  $mode     =  $this ->_default_error_mode ;
  552.                  $options  =  $this ->_default_error_options ;
  553.              // Global error handler
  554.              }  elseif  ( isset ( $GLOBALS [ '_PEAR_default_error_mode' ] ) )  {
  555.                  $mode     =  $GLOBALS [ '_PEAR_default_error_mode' ] ;
  556.                  $options  =  $GLOBALS [ '_PEAR_default_error_options' ] ;
  557.              }
  558.          }
  559.  
  560.          if  ( $error_class  !==  null )  {
  561.              $ec  =  $error_class ;
  562.          }  elseif  ( isset ( $this )  &&  isset ( $this ->_error_class ) )  {
  563.              $ec  =  $this ->_error_class ;
  564.          }  else  {
  565.              $ec  =  'PEAR_Error' ;
  566.          }
  567.          if  ( intval ( PHP_VERSION )  <  5 )  {
  568.              // little non-eval hack to fix bug #12147
  569.              include  'PEAR/FixPHP5PEARWarnings.php' ;
  570.              return  $a ;
  571.          }
  572.          if  ( $skipmsg )  {
  573.              $a  =  new  $ec ( $code ,  $mode ,  $options ,  $userinfo ) ;
  574.          }  else  {
  575.              $a  =  new  $ec ( $message ,  $code ,  $mode ,  $options ,  $userinfo ) ;
  576.          }
  577.          return  $a ;
  578.      }
  579.  
  580.      // }}}
  581.      // {{{ throwError()
  582.  
  583.      /**
  584.      * Simpler form of raiseError with fewer options.  In most cases
  585.      * message, code and userinfo are enough.
  586.      *
  587.      * @param string $message
  588.      *
  589.      */
  590.      function  &throwError ( $message  =  null ,
  591.                           $code  =  null ,
  592.                           $userinfo  =  null )
  593.      {
  594.          if  ( isset ( $this )  &&  is_a ( $this ,  'PEAR' ) )  {
  595.              $a  =  & $this -> raiseError ( $message ,  $code ,  null ,  null ,  $userinfo ) ;
  596.              return  $a ;
  597.          }  else  {
  598.              $a  =  &PEAR :: raiseError ( $message ,  $code ,  null ,  null ,  $userinfo ) ;
  599.              return  $a ;
  600.          }
  601.      }
  602.  
  603.      // }}}
  604.      function staticPushErrorHandling ( $mode ,  $options  =  null )
  605.      {
  606.          $stack  =  & $GLOBALS [ '_PEAR_error_handler_stack' ] ;
  607.          $def_mode     =  & $GLOBALS [ '_PEAR_default_error_mode' ] ;
  608.          $def_options  =  & $GLOBALS [ '_PEAR_default_error_options' ] ;
  609.          $stack [ ]  =  array ( $def_mode ,  $def_options ) ;
  610.          switch  ( $mode )  {
  611.              case PEAR_ERROR_EXCEPTION :
  612.              case PEAR_ERROR_RETURN :
  613.              case PEAR_ERROR_PRINT :
  614.              case PEAR_ERROR_TRIGGER :
  615.              case PEAR_ERROR_DIE :
  616.              case  null :
  617.                  $def_mode  =  $mode ;
  618.                  $def_options  =  $options ;
  619.                  break ;
  620.  
  621.              case PEAR_ERROR_CALLBACK :
  622.                  $def_mode  =  $mode ;
  623.                  // class/object method callback
  624.                  if  ( is_callable ( $options ) )  {
  625.                      $def_options  =  $options ;
  626.                  }  else  {
  627.                      trigger_error ( "invalid error callback" ,  E_USER_WARNING ) ;
  628.                  }
  629.                  break ;
  630.  
  631.              default :
  632.                  trigger_error ( "invalid error mode" ,  E_USER_WARNING ) ;
  633.                  break ;
  634.          }
  635.          $stack [ ]  =  array ( $mode ,  $options ) ;
  636.          return  true ;
  637.      }
  638.  
  639.      function staticPopErrorHandling ( )
  640.      {
  641.          $stack  =  & $GLOBALS [ '_PEAR_error_handler_stack' ] ;
  642.          $setmode      =  & $GLOBALS [ '_PEAR_default_error_mode' ] ;
  643.          $setoptions   =  & $GLOBALS [ '_PEAR_default_error_options' ] ;
  644.          array_pop ( $stack ) ;
  645.          list ( $mode ,  $options )  =  $stack [ sizeof ( $stack )  -  1 ] ;
  646.          array_pop ( $stack ) ;
  647.          switch  ( $mode )  {
  648.              case PEAR_ERROR_EXCEPTION :
  649.              case PEAR_ERROR_RETURN :
  650.              case PEAR_ERROR_PRINT :
  651.              case PEAR_ERROR_TRIGGER :
  652.              case PEAR_ERROR_DIE :
  653.              case  null :
  654.                  $setmode  =  $mode ;
  655.                  $setoptions  =  $options ;
  656.                  break ;
  657.  
  658.              case PEAR_ERROR_CALLBACK :
  659.                  $setmode  =  $mode ;
  660.                  // class/object method callback
  661.                  if  ( is_callable ( $options ) )  {
  662.                      $setoptions  =  $options ;
  663.                  }  else  {
  664.                      trigger_error ( "invalid error callback" ,  E_USER_WARNING ) ;
  665.                  }
  666.                  break ;
  667.  
  668.              default :
  669.                  trigger_error ( "invalid error mode" ,  E_USER_WARNING ) ;
  670.                  break ;
  671.          }
  672.          return  true ;
  673.      }
  674.  
  675.      // {{{ pushErrorHandling()
  676.  
  677.      /**
  678.      * Push a new error handler on top of the error handler options stack. With this
  679.      * you can easily override the actual error handler for some code and restore
  680.      * it later with popErrorHandling.
  681.      *
  682.      * @param mixed $mode (same as setErrorHandling)
  683.      * @param mixed $options (same as setErrorHandling)
  684.      *
  685.      * @return bool Always true
  686.      *
  687.      * @see PEAR::setErrorHandling
  688.      */
  689.      function pushErrorHandling ( $mode ,  $options  =  null )
  690.      {
  691.          $stack  =  & $GLOBALS [ '_PEAR_error_handler_stack' ] ;
  692.          if  ( isset ( $this )  &&  is_a ( $this ,  'PEAR' ) )  {
  693.              $def_mode     =  & $this ->_default_error_mode ;
  694.              $def_options  =  & $this ->_default_error_options ;
  695.          }  else  {
  696.              $def_mode     =  & $GLOBALS [ '_PEAR_default_error_mode' ] ;
  697.              $def_options  =  & $GLOBALS [ '_PEAR_default_error_options' ] ;
  698.          }
  699.          $stack [ ]  =  array ( $def_mode ,  $def_options ) ;
  700.  
  701.          if  ( isset ( $this )  &&  is_a ( $this ,  'PEAR' ) )  {
  702.              $this -> setErrorHandling ( $mode ,  $options ) ;
  703.          }  else  {
  704.             PEAR :: setErrorHandling ( $mode ,  $options ) ;
  705.          }
  706.          $stack [ ]  =  array ( $mode ,  $options ) ;
  707.          return  true ;
  708.      }
  709.  
  710.      // }}}
  711.      // {{{ popErrorHandling()
  712.  
  713.      /**
  714.     * Pop the last error handler used
  715.     *
  716.     * @return bool Always true
  717.     *
  718.     * @see PEAR::pushErrorHandling
  719.     */
  720.      function popErrorHandling ( )
  721.      {
  722.          $stack  =  & $GLOBALS [ '_PEAR_error_handler_stack' ] ;
  723.          array_pop ( $stack ) ;
  724.          list ( $mode ,  $options )  =  $stack [ sizeof ( $stack )  -  1 ] ;
  725.          array_pop ( $stack ) ;
  726.          if  ( isset ( $this )  &&  is_a ( $this ,  'PEAR' ) )  {
  727.              $this -> setErrorHandling ( $mode ,  $options ) ;
  728.          }  else  {
  729.             PEAR :: setErrorHandling ( $mode ,  $options ) ;
  730.          }
  731.          return  true ;
  732.      }
  733.  
  734.      // }}}
  735.      // {{{ loadExtension()
  736.  
  737.      /**
  738.     * OS independant PHP extension load. Remember to take care
  739.     * on the correct extension name for case sensitive OSes.
  740.     *
  741.     * @param string $ext The extension name
  742.     * @return bool Success or not on the dl() call
  743.     */
  744.      function loadExtension ( $ext )
  745.      {
  746.          if  ( ! extension_loaded ( $ext ) )  {
  747.              // if either returns true dl() will produce a FATAL error, stop that
  748.              if  ( ( ini_get ( 'enable_dl' )  !=  1 )  ||  ( ini_get ( 'safe_mode' )  ==  1 ) )  {
  749.                  return  false ;
  750.              }
  751.              if  (OS_WINDOWS )  {
  752.                  $suffix  =  '.dll' ;
  753.              }  elseif  ( PHP_OS  ==  'HP-UX' )  {
  754.                  $suffix  =  '.sl' ;
  755.              }  elseif  ( PHP_OS  ==  'AIX' )  {
  756.                  $suffix  =  '.a' ;
  757.              }  elseif  ( PHP_OS  ==  'OSX' )  {
  758.                  $suffix  =  '.bundle' ;
  759.              }  else  {
  760.                  $suffix  =  '.so' ;
  761.              }
  762.              return  @ dl ( 'php_' . $ext . $suffix )  ||  @ dl ( $ext . $suffix ) ;
  763.          }
  764.          return  true ;
  765.      }
  766.  
  767.      // }}}
  768. }
  769.  
  770. // {{{ _PEAR_call_destructors()
  771.  
  772. function _PEAR_call_destructors ( )
  773. {
  774.      global  $_PEAR_destructor_object_list ;
  775.      if  ( is_array ( $_PEAR_destructor_object_list )  &&
  776.          sizeof ( $_PEAR_destructor_object_list ) )
  777.      {
  778.          reset ( $_PEAR_destructor_object_list ) ;
  779.          if  (PEAR :: getStaticProperty ( 'PEAR' ,  'destructlifo' ) )  {
  780.              $_PEAR_destructor_object_list  =  array_reverse ( $_PEAR_destructor_object_list ) ;
  781.          }
  782.          while  ( list ( $k ,  $objref )  =  each ( $_PEAR_destructor_object_list ) )  {
  783.              $classname  =  get_class ( $objref ) ;
  784.              while  ( $classname )  {
  785.                  $destructor  =  "_$classname" ;
  786.                  if  ( method_exists ( $objref ,  $destructor ) )  {
  787.                      $objref -> $destructor ( ) ;
  788.                      break ;
  789.                  }  else  {
  790.                      $classname  =  get_parent_class ( $classname ) ;
  791.                  }
  792.              }
  793.          }
  794.          // Empty the object list to ensure that destructors are
  795.          // not called more than once.
  796.          $_PEAR_destructor_object_list  =  array ( ) ;
  797.      }
  798.  
  799.      // Now call the shutdown functions
  800.      if  ( is_array ( $GLOBALS [ '_PEAR_shutdown_funcs' ] ) AND  ! empty ( $GLOBALS [ '_PEAR_shutdown_funcs' ] ) )  {
  801.          foreach  ( $GLOBALS [ '_PEAR_shutdown_funcs' ]  as  $value )  {
  802.              call_user_func_array ( $value [ 0 ] ,  $value [ 1 ] ) ;
  803.          }
  804.      }
  805. }
  806.  
  807. // }}}
  808. /**
  809.  * Standard PEAR error class for PHP 4
  810.  *
  811.  * This class is supserseded by {@link PEAR_Exception} in PHP 5
  812.  *
  813.  * @category   pear
  814.  * @package    PEAR
  815.  * @author     Stig Bakken
  816.  * @author     Tomas V.V. Cox
  817.  * @author     Gregory Beaver
  818.  * @copyright  1997-2006 The PHP Group
  819.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  820.  * @version    Release: 1.7.2
  821.  * @link       http://pear.php.net/manual/en/core.pear.pear-error.php
  822.  * @see        PEAR::raiseError(), PEAR::throwError()
  823.  * @since      Class available since PHP 4.0.2
  824.  */
  825. class PEAR_Error
  826. {
  827.      // {{{ properties
  828.  
  829.      var  $error_message_prefix  =  '' ;
  830.      var  $mode                  = PEAR_ERROR_RETURN ;
  831.      var  $level                 =  E_USER_NOTICE ;
  832.      var  $code                  =  - 1 ;
  833.      var  $message               =  '' ;
  834.      var  $userinfo              =  '' ;
  835.      var  $backtrace             =  null ;
  836.  
  837.      // }}}
  838.      // {{{ constructor
  839.  
  840.      /**
  841.      * PEAR_Error constructor
  842.      *
  843.      * @param string $message  message
  844.      *
  845.      * @param int $code     (optional) error code
  846.      *
  847.      * @param int $mode     (optional) error mode, one of: PEAR_ERROR_RETURN,
  848.      * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
  849.      * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
  850.      *
  851.      * @param mixed $options   (optional) error level, _OR_ in the case of
  852.      * PEAR_ERROR_CALLBACK, the callback function or object/method
  853.      * tuple.
  854.      *
  855.      * @param string $userinfo (optional) additional user/debug info
  856.      *
  857.      * @access public
  858.      *
  859.      */
  860.      function PEAR_Error ( $message  =  'unknown error' ,  $code  =  null ,
  861.                          $mode  =  null ,  $options  =  null ,  $userinfo  =  null )
  862.      {
  863.          if  ( $mode  ===  null )  {
  864.              $mode  = PEAR_ERROR_RETURN ;
  865.          }
  866.          $this -> message    =  $message ;
  867.          $this -> code       =  $code ;
  868.          $this -> mode       =  $mode ;
  869.          $this -> userinfo   =  $userinfo ;
  870.          if  ( !PEAR :: getStaticProperty ( 'PEAR_Error' ,  'skiptrace' ) )  {
  871.              $this -> backtrace  =  debug_backtrace ( ) ;
  872.              if  ( isset ( $this -> backtrace [ 0 ] )  &&  isset ( $this -> backtrace [ 0 ] [ 'object' ] ) )  {
  873.                  unset ( $this -> backtrace [ 0 ] [ 'object' ] ) ;
  874.              }
  875.          }
  876.          if  ( $mode  & PEAR_ERROR_CALLBACK )  {
  877.              $this -> level  =  E_USER_NOTICE ;
  878.              $this -> callback  =  $options ;
  879.          }  else  {
  880.              if  ( $options  ===  null )  {
  881.                  $options  =  E_USER_NOTICE ;
  882.              }
  883.              $this -> level  =  $options ;
  884.              $this -> callback  =  null ;
  885.          }
  886.          if  ( $this -> mode  & PEAR_ERROR_PRINT )  {
  887.              if  ( is_null ( $options )  ||  is_int ( $options ) )  {
  888.                  $format  =  "%s" ;
  889.              }  else  {
  890.                  $format  =  $options ;
  891.              }
  892.              printf ( $format ,  $this -> getMessage ( ) ) ;
  893.          }
  894.          if  ( $this -> mode  & PEAR_ERROR_TRIGGER )  {
  895.              trigger_error ( $this -> getMessage ( ) ,  $this -> level ) ;
  896.          }
  897.          if  ( $this -> mode  & PEAR_ERROR_DIE )  {
  898.              $msg  =  $this -> getMessage ( ) ;
  899.              if  ( is_null ( $options )  ||  is_int ( $options ) )  {
  900.                  $format  =  "%s" ;
  901.                  if  ( substr ( $msg ,  - 1 )  !=  "\n" )  {
  902.                      $msg  .=  "\n" ;
  903.                  }
  904.              }  else  {
  905.                  $format  =  $options ;
  906.              }
  907.              die ( sprintf ( $format ,  $msg ) ) ;
  908.          }
  909.          if  ( $this -> mode  & PEAR_ERROR_CALLBACK )  {
  910.              if  ( is_callable ( $this -> callback ) )  {
  911.                  call_user_func ( $this -> callback ,  $this ) ;
  912.              }
  913.          }
  914.          if  ( $this -> mode  & PEAR_ERROR_EXCEPTION )  {
  915.              trigger_error ( "PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions" ,  E_USER_WARNING ) ;
  916.              eval ( '$e = new Exception($this->message, $this->code);throw($e);' ) ;
  917.          }
  918.      }
  919.  
  920.      // }}}
  921.      // {{{ getMode()
  922.  
  923.      /**
  924.      * Get the error mode from an error object.
  925.      *
  926.      * @return int error mode
  927.      * @access public
  928.      */
  929.      function getMode ( )  {
  930.          return  $this -> mode ;
  931.      }
  932.  
  933.      // }}}
  934.      // {{{ getCallback()
  935.  
  936.      /**
  937.      * Get the callback function/method from an error object.
  938.      *
  939.      * @return mixed callback function or object/method array
  940.      * @access public
  941.      */
  942.      function getCallback ( )  {
  943.          return  $this -> callback ;
  944.      }
  945.  
  946.      // }}}
  947.      // {{{ getMessage()
  948.  
  949.  
  950.      /**
  951.      * Get the error message from an error object.
  952.      *
  953.      * @return  string  full error message
  954.      * @access public
  955.      */
  956.      function getMessage ( )
  957.      {
  958.          return  ( $this -> error_message_prefix  .  $this -> message ) ;
  959.      }
  960.  
  961.  
  962.      // }}}
  963.      // {{{ getCode()
  964.  
  965.      /**
  966.      * Get error code from an error object
  967.      *
  968.      * @return int error code
  969.      * @access public
  970.      */
  971.       function getCode ( )
  972.       {
  973.          return  $this -> code ;
  974.       }
  975.  
  976.      // }}}
  977.      // {{{ getType()
  978.  
  979.      /**
  980.      * Get the name of this error/exception.
  981.      *
  982.      * @return string error/exception name (type)
  983.      * @access public
  984.      */
  985.      function  getType ( )
  986.      {
  987.          return  get_class ( $this ) ;
  988.      }
  989.  
  990.      // }}}
  991.      // {{{ getUserInfo()
  992.  
  993.      /**
  994.      * Get additional user-supplied information.
  995.      *
  996.      * @return string user-supplied information
  997.      * @access public
  998.      */
  999.      function getUserInfo ( )
  1000.      {
  1001.          return  $this -> userinfo ;
  1002.      }
  1003.  
  1004.      // }}}
  1005.      // {{{ getDebugInfo()
  1006.  
  1007.      /**
  1008.      * Get additional debug information supplied by the application.
  1009.      *
  1010.      * @return string debug information
  1011.      * @access public
  1012.      */
  1013.      function getDebugInfo ( )
  1014.      {
  1015.          return  $this -> getUserInfo ( ) ;
  1016.      }
  1017.  
  1018.      // }}}
  1019.      // {{{ getBacktrace()
  1020.  
  1021.      /**
  1022.      * Get the call backtrace from where the error was generated.
  1023.      * Supported with PHP 4.3.0 or newer.
  1024.      *
  1025.      * @param int $frame (optional) what frame to fetch
  1026.      * @return array Backtrace, or NULL if not available.
  1027.      * @access public
  1028.      */
  1029.      function getBacktrace ( $frame  =  null )
  1030.      {
  1031.          if  ( defined ( 'PEAR_IGNORE_BACKTRACE' ) )  {
  1032.              return  null ;
  1033.          }
  1034.          if  ( $frame  ===  null )  {
  1035.              return  $this -> backtrace ;
  1036.          }
  1037.          return  $this -> backtrace [ $frame ] ;
  1038.      }
  1039.  
  1040.      // }}}
  1041.      // {{{ addUserInfo()
  1042.  
  1043.      function addUserInfo ( $info )
  1044.      {
  1045.          if  ( empty ( $this -> userinfo ) )  {
  1046.              $this -> userinfo  =  $info ;
  1047.          }  else  {
  1048.              $this -> userinfo  .=  " ** $info" ;
  1049.          }
  1050.      }
  1051.  
  1052.      // }}}
  1053.      // {{{ toString()
  1054.      function __toString ( )
  1055.      {
  1056.          return  $this -> getMessage ( ) ;
  1057.      }
  1058.      // }}}
  1059.      // {{{ toString()
  1060.  
  1061.      /**
  1062.      * Make a string representation of this object.
  1063.      *
  1064.      * @return string a string with an object summary
  1065.      * @access public
  1066.      */
  1067.      function toString ( )  {
  1068.          $modes  =  array ( ) ;
  1069.          $levels  =  array ( E_USER_NOTICE   =>  'notice' ,
  1070.                          E_USER_WARNING  =>  'warning' ,
  1071.                          E_USER_ERROR    =>  'error' ) ;
  1072.          if  ( $this -> mode  & PEAR_ERROR_CALLBACK )  {
  1073.              if  ( is_array ( $this -> callback ) )  {
  1074.                  $callback  =  ( is_object ( $this -> callback [ 0 ] ) ?
  1075.                      strtolower ( get_class ( $this -> callback [ 0 ] ) )  :
  1076.                      $this -> callback [ 0 ] )  .  '::'  .
  1077.                      $this -> callback [ 1 ] ;
  1078.              }  else  {
  1079.                  $callback  =  $this -> callback ;
  1080.              }
  1081.              return  sprintf ( '[%s: message="%s" code=%d mode=callback ' .
  1082.                             'callback=%s prefix="%s" info="%s"]' ,
  1083.                             strtolower ( get_class ( $this ) ) ,  $this -> message ,  $this -> code ,
  1084.                             $callback ,  $this -> error_message_prefix ,
  1085.                             $this -> userinfo ) ;
  1086.          }
  1087.          if  ( $this -> mode  & PEAR_ERROR_PRINT )  {
  1088.              $modes [ ]  =  'print' ;
  1089.          }
  1090.          if  ( $this -> mode  & PEAR_ERROR_TRIGGER )  {
  1091.              $modes [ ]  =  'trigger' ;
  1092.          }
  1093.          if  ( $this -> mode  & PEAR_ERROR_DIE )  {
  1094.              $modes [ ]  =  'die' ;
  1095.          }
  1096.          if  ( $this -> mode  & PEAR_ERROR_RETURN )  {
  1097.              $modes [ ]  =  'return' ;
  1098.          }
  1099.          return  sprintf ( '[%s: message="%s" code=%d mode=%s level=%s ' .
  1100.                         'prefix="%s" info="%s"]' ,
  1101.                         strtolower ( get_class ( $this ) ) ,  $this -> message ,  $this -> code ,
  1102.                         implode ( "|" ,  $modes ) ,  $levels [ $this -> level ] ,
  1103.                         $this -> error_message_prefix ,
  1104.                         $this -> userinfo ) ;
  1105.      }
  1106.  
  1107.      // }}}
  1108. }
  1109.  
  1110. /*
  1111.  * Local Variables:
  1112.  * mode: php
  1113.  * tab-width: 4
  1114.  * c-basic-offset: 4
  1115.  * End:
  1116.  */
  1117. ?>

 

  • PEAR.zip (7.7 KB)
  • 下载次数: 0

你可能感兴趣的:(pear)