Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
ValueGenerator.php
001 <?php
002 /**
003 * Zend Framework (http://framework.zend.com/)
004 *
005 * @link http://github.com/zendframework/zf2 for the canonical source repository
006 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
007 * @license http://framework.zend.com/license/new-bsd New BSD License
008 */
009
010 namespace Zend\Code\Generator;
011
012 use Zend\Stdlib\ArrayObject;
013
014 class ValueGenerator extends AbstractGenerator
015 {
016 /**#@+
017 * Constant values
018 */
019 const TYPE_AUTO = 'auto';
020 const TYPE_BOOLEAN = 'boolean';
021 const TYPE_BOOL = 'bool';
022 const TYPE_NUMBER = 'number';
023 const TYPE_INTEGER = 'integer';
024 const TYPE_INT = 'int';
025 const TYPE_FLOAT = 'float';
026 const TYPE_DOUBLE = 'double';
027 const TYPE_STRING = 'string';
028 const TYPE_ARRAY = 'array';
029 const TYPE_CONSTANT = 'constant';
030 const TYPE_NULL = 'null';
031 const TYPE_OBJECT = 'object';
032 const TYPE_OTHER = 'other';
033 /**#@-*/
034
035 const OUTPUT_MULTIPLE_LINE = 'multipleLine';
036 const OUTPUT_SINGLE_LINE = 'singleLine';
037
038 /**
039 * @var mixed
040 */
041 protected $value = null;
042
043 /**
044 * @var string
045 */
046 protected $type = self::TYPE_AUTO;
047
048 /**
049 * @var int
050 */
051 protected $arrayDepth = 0;
052
053 /**
054 * @var string
055 */
056 protected $outputMode = self::OUTPUT_MULTIPLE_LINE;
057
058 /**
059 * @var array
060 */
061 protected $allowedTypes = null;
062 /**
063 * Autodetectable constants
064 * @var ArrayObject
065 */
066 protected $constants = null;
067
068 /**
069 * @param mixed $value
070 * @param string $type
071 * @param string $outputMode
072 * @param ArrayObject $constants
073 */
074 public function __construct($value = null, $type = self::TYPE_AUTO, $outputMode = self::OUTPUT_MULTIPLE_LINE, ArrayObject $constants = null)
075 {
076 // strict check is important here if $type = AUTO
077 if ($value !== null) {
078 $this->setValue($value);
079 }
080 if ($type !== self::TYPE_AUTO) {
081 $this->setType($type);
082 }
083 if ($outputMode !== self::OUTPUT_MULTIPLE_LINE) {
084 $this->setOutputMode($outputMode);
085 }
086 if ($constants !== null) {
087 $this->constants = $constants;
088 } else {
089 $this->constants = new ArrayObject();
090 }
091 }
092
093 /**
094 * Init constant list by defined and magic constants
095 */
096 public function initEnvironmentConstants()
097 {
098 $constants = array(
099 '__DIR__',
100 '__FILE__',
101 '__LINE__',
102 '__CLASS__',
103 '__TRAIT__',
104 '__METHOD__',
105 '__FUNCTION__',
106 '__NAMESPACE__',
107 '::'
108 );
109 $constants = array_merge($constants, array_keys(get_defined_constants()), $this->constants->getArrayCopy());
110 $this->constants->exchangeArray($constants);
111 }
112
113 /**
114 * Add constant to list
115 *
116 * @param string $constant
117 *
118 * @return $this
119 */
120 public function addConstant($constant)
121 {
122 $this->constants->append($constant);
123
124 return $this;
125 }
126
127 /**
128 * Delete constant from constant list
129 *
130 * @param string $constant
131 *
132 * @return bool
133 */
134 public function deleteConstant($constant)
135 {
136 if (($index = array_search($constant, $this->constants->getArrayCopy())) !== false) {
137 $this->constants->offsetUnset($index);
138 }
139
140 return $index !== false;
141 }
142
143 /**
144 * Return constant list
145 *
146 * @return ArrayObject
147 */
148 public function getConstants()
149 {
150 return $this->constants;
151 }
152
153 /**
154 * @return bool
155 */
156 public function isValidConstantType()
157 {
158 if ($this->type == self::TYPE_AUTO) {
159 $type = $this->getAutoDeterminedType($this->value);
160 } else {
161 $type = $this->type;
162 }
163
164 // valid types for constants
165 $scalarTypes = array(
166 self::TYPE_BOOLEAN,
167 self::TYPE_BOOL,
168 self::TYPE_NUMBER,
169 self::TYPE_INTEGER,
170 self::TYPE_INT,
171 self::TYPE_FLOAT,
172 self::TYPE_DOUBLE,
173 self::TYPE_STRING,
174 self::TYPE_CONSTANT,
175 self::TYPE_NULL
176 );
177
178 return in_array($type, $scalarTypes);
179 }
180
181 /**
182 * @param mixed $value
183 * @return ValueGenerator
184 */
185 public function setValue($value)
186 {
187 $this->value = $value;
188 return $this;
189 }
190
191 /**
192 * @return mixed
193 */
194 public function getValue()
195 {
196 return $this->value;
197 }
198
199 /**
200 * @param string $type
201 * @return ValueGenerator
202 */
203 public function setType($type)
204 {
205 $this->type = (string) $type;
206 return $this;
207 }
208
209 /**
210 * @return string
211 */
212 public function getType()
213 {
214 return $this->type;
215 }
216
217 /**
218 * @param int $arrayDepth
219 * @return ValueGenerator
220 */
221 public function setArrayDepth($arrayDepth)
222 {
223 $this->arrayDepth = (int) $arrayDepth;
224 return $this;
225 }
226
227 /**
228 * @return int
229 */
230 public function getArrayDepth()
231 {
232 return $this->arrayDepth;
233 }
234
235 /**
236 * @param string $type
237 * @return string
238 */
239 protected function getValidatedType($type)
240 {
241 $types = array(
242 self::TYPE_AUTO,
243 self::TYPE_BOOLEAN,
244 self::TYPE_BOOL,
245 self::TYPE_NUMBER,
246 self::TYPE_INTEGER,
247 self::TYPE_INT,
248 self::TYPE_FLOAT,
249 self::TYPE_DOUBLE,
250 self::TYPE_STRING,
251 self::TYPE_ARRAY,
252 self::TYPE_CONSTANT,
253 self::TYPE_NULL,
254 self::TYPE_OBJECT,
255 self::TYPE_OTHER
256 );
257
258 if (in_array($type, $types)) {
259 return $type;
260 }
261
262 return self::TYPE_AUTO;
263 }
264
265 /**
266 * @param mixed $value
267 * @return string
268 */
269 public function getAutoDeterminedType($value)
270 {
271 switch (gettype($value)) {
272 case 'boolean':
273 return self::TYPE_BOOLEAN;
274 case 'string':
275 foreach ($this->constants as $constant) {
276 if (strpos($value, $constant) !== false) {
277 return self::TYPE_CONSTANT;
278 }
279 }
280 return self::TYPE_STRING;
281 case 'double':
282 case 'float':
283 case 'integer':
284 return self::TYPE_NUMBER;
285 case 'array':
286 return self::TYPE_ARRAY;
287 case 'NULL':
288 return self::TYPE_NULL;
289 case 'object':
290 case 'resource':
291 case 'unknown type':
292 default:
293 return self::TYPE_OTHER;
294 }
295 }
296
297 /**
298 * @throws Exception\RuntimeException
299 * @return string
300 */
301 public function generate()
302 {
303 $type = $this->type;
304
305 if ($type != self::TYPE_AUTO) {
306 $type = $this->getValidatedType($type);
307 }
308
309 $value = $this->value;
310
311 if ($type == self::TYPE_AUTO) {
312 $type = $this->getAutoDeterminedType($value);
313 }
314
315 if ($type == self::TYPE_ARRAY) {
316 foreach ($value as &$curValue) {
317 if ($curValue instanceof self) {
318 continue;
319 }
320 $curValue = new self($curValue, self::TYPE_AUTO, self::OUTPUT_MULTIPLE_LINE, $this->getConstants());
321 }
322 }
323
324 $output = '';
325
326 switch ($type) {
327 case self::TYPE_BOOLEAN:
328 case self::TYPE_BOOL:
329 $output .= ($value ? 'true' : 'false');
330 break;
331 case self::TYPE_STRING:
332 $output .= self::escape($value);
333 break;
334 case self::TYPE_NULL:
335 $output .= 'null';
336 break;
337 case self::TYPE_NUMBER:
338 case self::TYPE_INTEGER:
339 case self::TYPE_INT:
340 case self::TYPE_FLOAT:
341 case self::TYPE_DOUBLE:
342 case self::TYPE_CONSTANT:
343 $output .= $value;
344 break;
345 case self::TYPE_ARRAY:
346 $output .= 'array(';
347 if ($this->outputMode == self::OUTPUT_MULTIPLE_LINE) {
348 $output .= self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth + 1);
349 }
350 $outputParts = array();
351 $noKeyIndex = 0;
352 foreach ($value as $n => $v) {
353 /* @var $v ValueGenerator */
354 $v->setArrayDepth($this->arrayDepth + 1);
355 $partV = $v->generate();
356 $short = false;
357 if (is_int($n)) {
358 if ($n === $noKeyIndex) {
359 $short = true;
360 $noKeyIndex++;
361 } else {
362 $noKeyIndex = max($n + 1, $noKeyIndex);
363 }
364 }
365
366 if ($short) {
367 $outputParts[] = $partV;
368 } else {
369 $outputParts[] = (is_int($n) ? $n : self::escape($n)) . ' => ' . $partV;
370 }
371 }
372 $padding = ($this->outputMode == self::OUTPUT_MULTIPLE_LINE)
373 ? self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth + 1)
374 : ' ';
375 $output .= implode(',' . $padding, $outputParts);
376 if ($this->outputMode == self::OUTPUT_MULTIPLE_LINE) {
377 if (count($outputParts) > 0) {
378 $output .= ',';
379 }
380 $output .= self::LINE_FEED . str_repeat($this->indentation, $this->arrayDepth);
381 }
382 $output .= ')';
383 break;
384 case self::TYPE_OTHER:
385 default:
386 throw new Exception\RuntimeException(
387 sprintf('Type "%s" is unknown or cannot be used as property default value.', get_class($value))
388 );
389 }
390
391 return $output;
392 }
393
394 /**
395 * Quotes value for PHP code.
396 *
397 * @param string $input Raw string.
398 * @param bool $quote Whether add surrounding quotes or not.
399 * @return string PHP-ready code.
400 */
401 public static function escape($input, $quote = true)
402 {
403 $output = addcslashes($input, "\\'");
404
405 // adds quoting strings
406 if ($quote) {
407 $output = "'" . $output . "'";
408 }
409
410 return $output;
411 }
412
413 /**
414 * @param string $outputMode
415 * @return ValueGenerator
416 */
417 public function setOutputMode($outputMode)
418 {
419 $this->outputMode = (string) $outputMode;
420 return $this;
421 }
422
423 /**
424 * @return string
425 */
426 public function getOutputMode()
427 {
428 return $this->outputMode;
429 }
430
431 public function __toString()
432 {
433 return $this->generate();
434 }
435 }
436