Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
/**
3
 * Class auto-loader
4
 *
5
 * PHP versions 4
6
 
7
 *
8
 * @category   pear
9
 * @package    PEAR
10
 * @author     Stig Bakken <ssb@php.net>
11
 * @copyright  1997-2009 The Authors
12
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
13
 * @version    CVS: $Id: Autoloader.php 313023 2011-07-06 19:17:11Z dufuz $
14
 * @link       http://pear.php.net/manual/en/core.ppm.php#core.ppm.pear-autoloader
15
 * @since      File available since Release 0.1
16
 * @deprecated File deprecated in Release 1.4.0a1
17
 */
18
 
19
// /* vim: set expandtab tabstop=4 shiftwidth=4: */
20
 
21
if (!extension_loaded("overload")) {
22
    // die hard without ext/overload
23
    die("Rebuild PHP with the `overload' extension to use PEAR_Autoloader");
24
}
25
 
26
/**
27
 * Include for PEAR_Error and PEAR classes
28
 */
29
require_once "PEAR.php";
30
 
31
/**
32
 * This class is for objects where you want to separate the code for
33
 * some methods into separate classes.  This is useful if you have a
34
 * class with not-frequently-used methods that contain lots of code
35
 * that you would like to avoid always parsing.
36
 *
37
 * The PEAR_Autoloader class provides autoloading and aggregation.
38
 * The autoloading lets you set up in which classes the separated
39
 * methods are found.  Aggregation is the technique used to import new
40
 * methods, an instance of each class providing separated methods is
41
 * stored and called every time the aggregated method is called.
42
 *
43
 * @category   pear
44
 * @package    PEAR
45
 * @author Stig Bakken <ssb@php.net>
46
 * @copyright  1997-2009 The Authors
47
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
48
 * @version    Release: 1.9.4
49
 * @link       http://pear.php.net/manual/en/core.ppm.php#core.ppm.pear-autoloader
50
 * @since      File available since Release 0.1
51
 * @deprecated File deprecated in Release 1.4.0a1
52
 */
53
class PEAR_Autoloader extends PEAR
54
{
55
    // {{{ properties
56
 
57
    /**
58
     * Map of methods and classes where they are defined
59
     *
60
     * @var array
61
     *
62
     * @access private
63
     */
64
    var $_autoload_map = array();
65
 
66
    /**
67
     * Map of methods and aggregate objects
68
     *
69
     * @var array
70
     *
71
     * @access private
72
     */
73
    var $_method_map = array();
74
 
75
    // }}}
76
    // {{{ addAutoload()
77
 
78
    /**
79
     * Add one or more autoload entries.
80
     *
81
     * @param string $method     which method to autoload
82
     *
83
     * @param string $classname  (optional) which class to find the method in.
84
     *                           If the $method parameter is an array, this
85
     *                           parameter may be omitted (and will be ignored
86
     *                           if not), and the $method parameter will be
87
     *                           treated as an associative array with method
88
     *                           names as keys and class names as values.
89
     *
90
     * @return void
91
     *
92
     * @access public
93
     */
94
    function addAutoload($method, $classname = null)
95
    {
96
        if (is_array($method)) {
97
            array_walk($method, create_function('$a,&$b', '$b = strtolower($b);'));
98
            $this->_autoload_map = array_merge($this->_autoload_map, $method);
99
        } else {
100
            $this->_autoload_map[strtolower($method)] = $classname;
101
        }
102
    }
103
 
104
    // }}}
105
    // {{{ removeAutoload()
106
 
107
    /**
108
     * Remove an autoload entry.
109
     *
110
     * @param string $method  which method to remove the autoload entry for
111
     *
112
     * @return bool TRUE if an entry was removed, FALSE if not
113
     *
114
     * @access public
115
     */
116
    function removeAutoload($method)
117
    {
118
        $method = strtolower($method);
119
        $ok = isset($this->_autoload_map[$method]);
120
        unset($this->_autoload_map[$method]);
121
        return $ok;
122
    }
123
 
124
    // }}}
125
    // {{{ addAggregateObject()
126
 
127
    /**
128
     * Add an aggregate object to this object.  If the specified class
129
     * is not defined, loading it will be attempted following PEAR's
130
     * file naming scheme.  All the methods in the class will be
131
     * aggregated, except private ones (name starting with an
132
     * underscore) and constructors.
133
     *
134
     * @param string $classname  what class to instantiate for the object.
135
     *
136
     * @return void
137
     *
138
     * @access public
139
     */
140
    function addAggregateObject($classname)
141
    {
142
        $classname = strtolower($classname);
143
        if (!class_exists($classname)) {
144
            $include_file = preg_replace('/[^a-z0-9]/i', '_', $classname);
145
            include_once $include_file;
146
        }
147
        $obj =& new $classname;
148
        $methods = get_class_methods($classname);
149
        foreach ($methods as $method) {
150
            // don't import priviate methods and constructors
151
            if ($method{0} != '_' && $method != $classname) {
152
                $this->_method_map[$method] = $obj;
153
            }
154
        }
155
    }
156
 
157
    // }}}
158
    // {{{ removeAggregateObject()
159
 
160
    /**
161
     * Remove an aggregate object.
162
     *
163
     * @param string $classname  the class of the object to remove
164
     *
165
     * @return bool  TRUE if an object was removed, FALSE if not
166
     *
167
     * @access public
168
     */
169
    function removeAggregateObject($classname)
170
    {
171
        $ok = false;
172
        $classname = strtolower($classname);
173
        reset($this->_method_map);
174
        while (list($method, $obj) = each($this->_method_map)) {
175
            if (is_a($obj, $classname)) {
176
                unset($this->_method_map[$method]);
177
                $ok = true;
178
            }
179
        }
180
        return $ok;
181
    }
182
 
183
    // }}}
184
    // {{{ __call()
185
 
186
    /**
187
     * Overloaded object call handler, called each time an
188
     * undefined/aggregated method is invoked.  This method repeats
189
     * the call in the right aggregate object and passes on the return
190
     * value.
191
     *
192
     * @param string $method  which method that was called
193
     *
194
     * @param string $args    An array of the parameters passed in the
195
     *                        original call
196
     *
197
     * @return mixed  The return value from the aggregated method, or a PEAR
198
     *                error if the called method was unknown.
199
     */
200
    function __call($method, $args, &$retval)
201
    {
202
        $method = strtolower($method);
203
        if (empty($this->_method_map[$method]) && isset($this->_autoload_map[$method])) {
204
            $this->addAggregateObject($this->_autoload_map[$method]);
205
        }
206
        if (isset($this->_method_map[$method])) {
207
            $retval = call_user_func_array(array($this->_method_map[$method], $method), $args);
208
            return true;
209
        }
210
        return false;
211
    }
212
 
213
    // }}}
214
}
215
 
216
overload("PEAR_Autoloader");
217
 
218
?>