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 |
FunctionReflection.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\Reflection;
011
012 use ReflectionFunction;
013
014 class FunctionReflection extends ReflectionFunction implements ReflectionInterface
015 {
016 /**
017 * Constant use in @MethodReflection to display prototype as an array
018 */
019 const PROTOTYPE_AS_ARRAY = 'prototype_as_array';
020
021 /**
022 * Constant use in @MethodReflection to display prototype as a string
023 */
024 const PROTOTYPE_AS_STRING = 'prototype_as_string';
025
026 /**
027 * Get function DocBlock
028 *
029 * @throws Exception\InvalidArgumentException
030 * @return DocBlockReflection
031 */
032 public function getDocBlock()
033 {
034 if ('' == ($comment = $this->getDocComment())) {
035 throw new Exception\InvalidArgumentException(sprintf(
036 '%s does not have a DocBlock',
037 $this->getName()
038 ));
039 }
040
041 $instance = new DocBlockReflection($comment);
042
043 return $instance;
044 }
045
046 /**
047 * Get start line (position) of function
048 *
049 * @param bool $includeDocComment
050 * @return int
051 */
052 public function getStartLine($includeDocComment = false)
053 {
054 if ($includeDocComment) {
055 if ($this->getDocComment() != '') {
056 return $this->getDocBlock()->getStartLine();
057 }
058 }
059
060 return parent::getStartLine();
061 }
062
063 /**
064 * Get contents of function
065 *
066 * @param bool $includeDocBlock
067 * @return string
068 */
069 public function getContents($includeDocBlock = true)
070 {
071 $fileName = $this->getFileName();
072 if (false === $fileName) {
073 return '';
074 }
075
076 $startLine = $this->getStartLine();
077 $endLine = $this->getEndLine();
078
079 // eval'd protect
080 if (preg_match('#\((\d+)\) : eval\(\)\'d code$#', $fileName, $matches)) {
081 $fileName = preg_replace('#\(\d+\) : eval\(\)\'d code$#', '', $fileName);
082 $startLine = $endLine = $matches[1];
083 }
084
085 $lines = array_slice(
086 file($fileName, FILE_IGNORE_NEW_LINES),
087 $startLine - 1,
088 ($endLine - ($startLine - 1)),
089 true
090 );
091
092 $functionLine = implode("\n", $lines);
093
094 $content = '';
095 if ($this->isClosure()) {
096 preg_match('#function\s*\([^\)]*\)\s*(use\s*\([^\)]+\))?\s*\{(.*\;)?\s*\}#s', $functionLine, $matches);
097 if (isset($matches[0])) {
098 $content = $matches[0];
099 }
100 } else {
101 $name = substr($this->getName(), strrpos($this->getName(), '\\')+1);
102 preg_match('#function\s+' . preg_quote($name) . '\s*\([^\)]*\)\s*{([^{}]+({[^}]+})*[^}]+)?}#', $functionLine, $matches);
103 if (isset($matches[0])) {
104 $content = $matches[0];
105 }
106 }
107
108 $docComment = $this->getDocComment();
109
110 return $includeDocBlock && $docComment ? $docComment . "\n" . $content : $content;
111 }
112
113 /**
114 * Get method prototype
115 *
116 * @return array
117 */
118 public function getPrototype($format = FunctionReflection::PROTOTYPE_AS_ARRAY)
119 {
120 $returnType = 'mixed';
121 $docBlock = $this->getDocBlock();
122 if ($docBlock) {
123 $return = $docBlock->getTag('return');
124 $returnTypes = $return->getTypes();
125 $returnType = count($returnTypes) > 1 ? implode('|', $returnTypes) : $returnTypes[0];
126 }
127
128 $prototype = array(
129 'namespace' => $this->getNamespaceName(),
130 'name' => substr($this->getName(), strlen($this->getNamespaceName()) + 1),
131 'return' => $returnType,
132 'arguments' => array(),
133 );
134
135 $parameters = $this->getParameters();
136 foreach ($parameters as $parameter) {
137 $prototype['arguments'][$parameter->getName()] = array(
138 'type' => $parameter->getType(),
139 'required' => !$parameter->isOptional(),
140 'by_ref' => $parameter->isPassedByReference(),
141 'default' => $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null,
142 );
143 }
144
145 if ($format == FunctionReflection::PROTOTYPE_AS_STRING) {
146 $line = $prototype['return'] . ' ' . $prototype['name'] . '(';
147 $args = array();
148 foreach ($prototype['arguments'] as $name => $argument) {
149 $argsLine = ($argument['type'] ? $argument['type'] . ' ' : '') . ($argument['by_ref'] ? '&' : '') . '$' . $name;
150 if (!$argument['required']) {
151 $argsLine .= ' = ' . var_export($argument['default'], true);
152 }
153 $args[] = $argsLine;
154 }
155 $line .= implode(', ', $args);
156 $line .= ')';
157
158 return $line;
159 }
160
161 return $prototype;
162 }
163
164 /**
165 * Get function parameters
166 *
167 * @return ParameterReflection[]
168 */
169 public function getParameters()
170 {
171 $phpReflections = parent::getParameters();
172 $zendReflections = array();
173 while ($phpReflections && ($phpReflection = array_shift($phpReflections))) {
174 $instance = new ParameterReflection($this->getName(), $phpReflection->getName());
175 $zendReflections[] = $instance;
176 unset($phpReflection);
177 }
178 unset($phpReflections);
179
180 return $zendReflections;
181 }
182
183 /**
184 * Get return type tag
185 *
186 * @throws Exception\InvalidArgumentException
187 * @return DocBlockReflection
188 */
189 public function getReturn()
190 {
191 $docBlock = $this->getDocBlock();
192 if (!$docBlock->hasTag('return')) {
193 throw new Exception\InvalidArgumentException(
194 'Function does not specify an @return annotation tag; cannot determine return type'
195 );
196 }
197
198 $tag = $docBlock->getTag('return');
199
200 return new DocBlockReflection('@return ' . $tag->getDescription());
201 }
202
203 /**
204 * Get method body
205 *
206 * @return string|false
207 */
208 public function getBody()
209 {
210 $fileName = $this->getFileName();
211 if (false === $fileName) {
212 throw new Exception\InvalidArgumentException(
213 'Cannot determine internals functions body'
214 );
215 }
216
217 $startLine = $this->getStartLine();
218 $endLine = $this->getEndLine();
219
220 // eval'd protect
221 if (preg_match('#\((\d+)\) : eval\(\)\'d code$#', $fileName, $matches)) {
222 $fileName = preg_replace('#\(\d+\) : eval\(\)\'d code$#', '', $fileName);
223 $startLine = $endLine = $matches[1];
224 }
225
226 $lines = array_slice(
227 file($fileName, FILE_IGNORE_NEW_LINES),
228 $startLine - 1,
229 ($endLine - ($startLine - 1)),
230 true
231 );
232
233 $functionLine = implode("\n", $lines);
234
235 $body = false;
236 if ($this->isClosure()) {
237 preg_match('#function\s*\([^\)]*\)\s*(use\s*\([^\)]+\))?\s*\{(.*\;)\s*\}#s', $functionLine, $matches);
238 if (isset($matches[2])) {
239 $body = $matches[2];
240 }
241 } else {
242 $name = substr($this->getName(), strrpos($this->getName(), '\\')+1);
243 preg_match('#function\s+' . $name . '\s*\([^\)]*\)\s*{([^{}]+({[^}]+})*[^}]+)}#', $functionLine, $matches);
244 if (isset($matches[1])) {
245 $body = $matches[1];
246 }
247 }
248
249 return $body;
250 }
251
252 /**
253 * @return string
254 */
255 public function toString()
256 {
257 return $this->__toString();
258 }
259
260 /**
261 * Required due to bug in php
262 *
263 * @return string
264 */
265 public function __toString()
266 {
267 return parent::__toString();
268 }
269 }
270