Project

General

Profile

1
<?php
2
/**
3
 * PhpThumb Base Class Definition File
4
 * 
5
 * This file contains the definition for the ThumbBase object
6
 * 
7
 * PHP Version 5 with GD 2.0+
8
 * PhpThumb : PHP Thumb Library <http://phpthumb.gxdlabs.com>
9
 * Copyright (c) 2009, Ian Selby/Gen X Design
10
 * 
11
 * Author(s): Ian Selby <ian@gen-x-design.com>
12
 * 
13
 * Licensed under the MIT License
14
 * Redistributions of files must retain the above copyright notice.
15
 * 
16
 * @author Ian Selby <ian@gen-x-design.com>
17
 * @copyright Copyright (c) 2009 Gen X Design
18
 * @link http://phpthumb.gxdlabs.com
19
 * @license http://www.opensource.org/licenses/mit-license.php The MIT License
20
 * @version 3.0
21
 * @package PhpThumb
22
 * @filesource
23
 */
24

    
25
/**
26
 * ThumbBase Class Definition
27
 * 
28
 * This is the base class that all implementations must extend.  It contains the 
29
 * core variables and functionality common to all implementations, as well as the functions that 
30
 * allow plugins to augment those classes.
31
 * 
32
 * @package PhpThumb
33
 * @subpackage Core
34
 */
35
abstract class ThumbBase 
36
{
37
    /**
38
     * All imported objects
39
     * 
40
     * An array of imported plugin objects
41
     * 
42
     * @var array
43
     */
44
    protected $imported;
45
    /**
46
     * All imported object functions
47
     * 
48
     * An array of all methods added to this class by imported plugin objects
49
     * 
50
     * @var array
51
     */
52
    protected $importedFunctions;
53
    /**
54
     * The last error message raised
55
     * 
56
     * @var string
57
     */
58
    protected $errorMessage;
59
    /**
60
     * Whether or not the current instance has any errors
61
     * 
62
     * @var bool
63
     */
64
    protected $hasError;
65
    /**
66
     * The name of the file we're manipulating
67
     * 
68
     * This must include the path to the file (absolute paths recommended)
69
     * 
70
     * @var string
71
     */
72
    protected $fileName;
73
    /**
74
     * What the file format is (mime-type)
75
     * 
76
     * @var string
77
     */
78
    protected $format;
79
    /**
80
     * Whether or not the image is hosted remotely
81
     * 
82
     * @var bool
83
     */
84
    protected $remoteImage;
85
    /**
86
     * Whether or not the current image is an actual file, or the raw file data
87
     *
88
     * By "raw file data" it's meant that we're actually passing the result of something
89
     * like file_get_contents() or perhaps from a database blob
90
     * 
91
     * @var bool
92
     */
93
    protected $isDataStream;
94
    
95
    /**
96
     * Class constructor
97
     * 
98
     * @return ThumbBase
99
     */
100
    public function __construct ($fileName, $isDataStream = false)
101
    {
102
        $this->imported                = array();
103
        $this->importedFunctions    = array();
104
        $this->errorMessage            = null;
105
        $this->hasError                = false;
106
        $this->fileName                = $fileName;
107
        $this->remoteImage            = false;
108
        $this->isDataStream            = $isDataStream;
109
        
110
        $this->fileExistsAndReadable();
111
    }
112
    
113
    /**
114
     * Imports plugins in $registry to the class
115
     * 
116
     * @param array $registry
117
     */
118
    public function importPlugins ($registry)
119
    {
120
        foreach ($registry as $plugin => $meta)
121
        {
122
            $this->imports($plugin);
123
        }
124
    }
125
    
126
    /**
127
     * Imports a plugin
128
     * 
129
     * This is where all the plugins magic happens!  This function "loads" the plugin functions, making them available as 
130
     * methods on the class.
131
     * 
132
     * @param string $object The name of the object to import / "load"
133
     */
134
    protected function imports ($object)
135
    {
136
        // the new object to import
137
        $newImport             = new $object();
138
        // the name of the new object (class name)
139
        $importName            = get_class($newImport);
140
        // the new functions to import
141
        $importFunctions     = get_class_methods($newImport);
142
        
143
        // add the object to the registry
144
        array_push($this->imported, array($importName, $newImport));
145
        
146
        // add the methods to the registry
147
        foreach ($importFunctions as $key => $functionName)
148
        {
149
            $this->importedFunctions[$functionName] = &$newImport;
150
        }
151
    }
152
    
153
    /**
154
     * Checks to see if $this->fileName exists and is readable
155
     * 
156
     */
157
    protected function fileExistsAndReadable ()
158
    {
159
        if ($this->isDataStream === true)
160
        {
161
            return;
162
        }
163
        
164
        if (stristr($this->fileName, 'http://') !== false)
165
        {
166
            $this->remoteImage = true;
167
            return;
168
        }
169
        
170
        if (!file_exists($this->fileName))
171
        {
172
            $this->triggerError('Image file not found: ' . $this->fileName);
173
        }
174
        elseif (!is_readable($this->fileName))
175
        {
176
            $this->triggerError('Image file not readable: ' . $this->fileName);
177
        }
178
    }
179
    
180
    /**
181
     * Sets $this->errorMessage to $errorMessage and throws an exception
182
     * 
183
     * Also sets $this->hasError to true, so even if the exceptions are caught, we don't
184
     * attempt to proceed with any other functions
185
     * 
186
     * @param string $errorMessage
187
     */
188
    protected function triggerError ($errorMessage)
189
    {
190
        $this->hasError     = true;
191
        $this->errorMessage    = $errorMessage;
192
        
193
        throw new Exception ($errorMessage);
194
    }
195
    
196
    /**
197
     * Calls plugin / imported functions
198
     * 
199
     * This is also where a fair amount of plugins magaic happens.  This magic method is called whenever an "undefined" class 
200
     * method is called in code, and we use that to call an imported function. 
201
     * 
202
     * You should NEVER EVER EVER invoke this function manually.  The universe will implode if you do... seriously ;)
203
     * 
204
     * @param string $method
205
     * @param array $args
206
     */
207
    public function __call ($method, $args)
208
    {
209
        if( array_key_exists($method, $this->importedFunctions))
210
        {
211
            $args[] = $this;
212
            return call_user_func_array(array($this->importedFunctions[$method], $method), $args);
213
        }
214
        
215
        throw new BadMethodCallException ('Call to undefined method/class function: ' . $method);
216
    }
217

    
218
    /**
219
     * Returns $imported.
220
     * @see ThumbBase::$imported
221
     * @return array
222
     */
223
    public function getImported ()
224
    {
225
        return $this->imported;
226
    }
227
    
228
    /**
229
     * Returns $importedFunctions.
230
     * @see ThumbBase::$importedFunctions
231
     * @return array
232
     */
233
    public function getImportedFunctions ()
234
    {
235
        return $this->importedFunctions;
236
    }
237
    
238
    /**
239
     * Returns $errorMessage.
240
     *
241
     * @see ThumbBase::$errorMessage
242
     */
243
    public function getErrorMessage ()
244
    {
245
        return $this->errorMessage;
246
    }
247
    
248
    /**
249
     * Sets $errorMessage.
250
     *
251
     * @param object $errorMessage
252
     * @see ThumbBase::$errorMessage
253
     */
254
    public function setErrorMessage ($errorMessage)
255
    {
256
        $this->errorMessage = $errorMessage;
257
    }
258
    
259
    /**
260
     * Returns $fileName.
261
     *
262
     * @see ThumbBase::$fileName
263
     */
264
    public function getFileName ()
265
    {
266
        return $this->fileName;
267
    }
268
    
269
    /**
270
     * Sets $fileName.
271
     *
272
     * @param object $fileName
273
     * @see ThumbBase::$fileName
274
     */
275
    public function setFileName ($fileName)
276
    {
277
        $this->fileName = $fileName;
278
    }
279
    
280
    /**
281
     * Returns $format.
282
     *
283
     * @see ThumbBase::$format
284
     */
285
    public function getFormat ()
286
    {
287
        return $this->format;
288
    }
289
    
290
    /**
291
     * Sets $format.
292
     *
293
     * @param object $format
294
     * @see ThumbBase::$format
295
     */
296
    public function setFormat ($format)
297
    {
298
        $this->format = $format;
299
    }
300
    
301
    /**
302
     * Returns $hasError.
303
     *
304
     * @see ThumbBase::$hasError
305
     */
306
    public function getHasError ()
307
    {
308
        return $this->hasError;
309
    }
310
    
311
    /**
312
     * Sets $hasError.
313
     *
314
     * @param object $hasError
315
     * @see ThumbBase::$hasError
316
     */
317
    public function setHasError ($hasError)
318
    {
319
        $this->hasError = $hasError;
320
    } 
321
    
322

    
323
}
(4-4/5)