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 |
MethodGenerator.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\Code\Reflection\MethodReflection;
013
014 class MethodGenerator extends AbstractMemberGenerator
015 {
016 /**
017 * @var DocBlockGenerator
018 */
019 protected $docBlock = null;
020
021 /**
022 * @var ParameterGenerator[]
023 */
024 protected $parameters = array();
025
026 /**
027 * @var string
028 */
029 protected $body = null;
030
031 /**
032 * @param MethodReflection $reflectionMethod
033 * @return MethodGenerator
034 */
035 public static function fromReflection(MethodReflection $reflectionMethod)
036 {
037 $method = new static();
038
039 $method->setSourceContent($reflectionMethod->getContents(false));
040 $method->setSourceDirty(false);
041
042 if ($reflectionMethod->getDocComment() != '') {
043 $method->setDocBlock(DocBlockGenerator::fromReflection($reflectionMethod->getDocBlock()));
044 }
045
046 $method->setFinal($reflectionMethod->isFinal());
047
048 if ($reflectionMethod->isPrivate()) {
049 $method->setVisibility(self::VISIBILITY_PRIVATE);
050 } elseif ($reflectionMethod->isProtected()) {
051 $method->setVisibility(self::VISIBILITY_PROTECTED);
052 } else {
053 $method->setVisibility(self::VISIBILITY_PUBLIC);
054 }
055
056 $method->setStatic($reflectionMethod->isStatic());
057
058 $method->setName($reflectionMethod->getName());
059
060 foreach ($reflectionMethod->getParameters() as $reflectionParameter) {
061 $method->setParameter(ParameterGenerator::fromReflection($reflectionParameter));
062 }
063
064 $method->setBody(static::clearBodyIndention($reflectionMethod->getBody()));
065
066 return $method;
067 }
068
069 /**
070 * Identify the space indention from the first line and remove this indention
071 * from all lines
072 *
073 * @param string $body
074 *
075 * @return string
076 */
077 protected static function clearBodyIndention($body)
078 {
079 if (empty($body)) {
080 return $body;
081 }
082
083 $lines = explode(PHP_EOL, $body);
084
085 $indention = str_replace(trim($lines[1]), '', $lines[1]);
086
087 foreach ($lines as $key => $line) {
088 if (substr($line, 0, strlen($indention)) == $indention) {
089 $lines[$key] = substr($line, strlen($indention));
090 }
091 }
092
093 $body = implode(PHP_EOL, $lines);
094
095 return $body;
096 }
097
098 /**
099 * Generate from array
100 *
101 * @configkey name string [required] Class Name
102 * @configkey docblock string The docblock information
103 * @configkey flags int Flags, one of MethodGenerator::FLAG_ABSTRACT MethodGenerator::FLAG_FINAL
104 * @configkey parameters string Class which this class is extending
105 * @configkey body string
106 * @configkey abstract bool
107 * @configkey final bool
108 * @configkey static bool
109 * @configkey visibility string
110 *
111 * @throws Exception\InvalidArgumentException
112 * @param array $array
113 * @return MethodGenerator
114 */
115 public static function fromArray(array $array)
116 {
117 if (!isset($array['name'])) {
118 throw new Exception\InvalidArgumentException(
119 'Method generator requires that a name is provided for this object'
120 );
121 }
122
123 $method = new static($array['name']);
124 foreach ($array as $name => $value) {
125 // normalize key
126 switch (strtolower(str_replace(array('.', '-', '_'), '', $name))) {
127 case 'docblock':
128 $docBlock = ($value instanceof DocBlockGenerator) ? $value : DocBlockGenerator::fromArray($value);
129 $method->setDocBlock($docBlock);
130 break;
131 case 'flags':
132 $method->setFlags($value);
133 break;
134 case 'parameters':
135 $method->setParameters($value);
136 break;
137 case 'body':
138 $method->setBody($value);
139 break;
140 case 'abstract':
141 $method->setAbstract($value);
142 break;
143 case 'final':
144 $method->setFinal($value);
145 break;
146 case 'static':
147 $method->setStatic($value);
148 break;
149 case 'visibility':
150 $method->setVisibility($value);
151 break;
152 }
153 }
154
155 return $method;
156 }
157
158 /**
159 * @param string $name
160 * @param array $parameters
161 * @param int $flags
162 * @param string $body
163 * @param DocBlockGenerator|string $docBlock
164 */
165 public function __construct(
166 $name = null,
167 array $parameters = array(),
168 $flags = self::FLAG_PUBLIC,
169 $body = null,
170 $docBlock = null
171 ) {
172 if ($name) {
173 $this->setName($name);
174 }
175 if ($parameters) {
176 $this->setParameters($parameters);
177 }
178 if ($flags !== self::FLAG_PUBLIC) {
179 $this->setFlags($flags);
180 }
181 if ($body) {
182 $this->setBody($body);
183 }
184 if ($docBlock) {
185 $this->setDocBlock($docBlock);
186 }
187 }
188
189 /**
190 * @param array $parameters
191 * @return MethodGenerator
192 */
193 public function setParameters(array $parameters)
194 {
195 foreach ($parameters as $parameter) {
196 $this->setParameter($parameter);
197 }
198
199 return $this;
200 }
201
202 /**
203 * @param ParameterGenerator|array|string $parameter
204 * @throws Exception\InvalidArgumentException
205 * @return MethodGenerator
206 */
207 public function setParameter($parameter)
208 {
209 if (is_string($parameter)) {
210 $parameter = new ParameterGenerator($parameter);
211 }
212
213 if (is_array($parameter)) {
214 $parameter = ParameterGenerator::fromArray($parameter);
215 }
216
217 if (!$parameter instanceof ParameterGenerator) {
218 throw new Exception\InvalidArgumentException(sprintf(
219 '%s is expecting either a string, array or an instance of %s\ParameterGenerator',
220 __METHOD__,
221 __NAMESPACE__
222 ));
223 }
224
225 $this->parameters[$parameter->getName()] = $parameter;
226
227 return $this;
228 }
229
230 /**
231 * @return ParameterGenerator[]
232 */
233 public function getParameters()
234 {
235 return $this->parameters;
236 }
237
238 /**
239 * @param string $body
240 * @return MethodGenerator
241 */
242 public function setBody($body)
243 {
244 $this->body = $body;
245 return $this;
246 }
247
248 /**
249 * @return string
250 */
251 public function getBody()
252 {
253 return $this->body;
254 }
255
256 /**
257 * @return string
258 */
259 public function generate()
260 {
261 $output = '';
262
263 $indent = $this->getIndentation();
264
265 if (($docBlock = $this->getDocBlock()) !== null) {
266 $docBlock->setIndentation($indent);
267 $output .= $docBlock->generate();
268 }
269
270 $output .= $indent;
271
272 if ($this->isAbstract()) {
273 $output .= 'abstract ';
274 } else {
275 $output .= (($this->isFinal()) ? 'final ' : '');
276 }
277
278 $output .= $this->getVisibility()
279 . (($this->isStatic()) ? ' static' : '')
280 . ' function ' . $this->getName() . '(';
281
282 $parameters = $this->getParameters();
283 if (!empty($parameters)) {
284 foreach ($parameters as $parameter) {
285 $parameterOutput[] = $parameter->generate();
286 }
287
288 $output .= implode(', ', $parameterOutput);
289 }
290
291 $output .= ')';
292
293 if ($this->isAbstract()) {
294 return $output . ';';
295 }
296
297 $output .= self::LINE_FEED . $indent . '{' . self::LINE_FEED;
298
299 if ($this->body) {
300 $output .= preg_replace('#^((?![a-zA-Z0-9_-]+;).+?)$#m', $indent . $indent . '$1', trim($this->body))
301 . self::LINE_FEED;
302 }
303
304 $output .= $indent . '}' . self::LINE_FEED;
305
306 return $output;
307 }
308
309 public function __toString()
310 {
311 return $this->generate();
312 }
313 }
314