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 |
DocBlockReflection.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 Reflector;
013 use Zend\Code\Reflection\DocBlock\Tag\TagInterface as DocBlockTagInterface;
014 use Zend\Code\Reflection\DocBlock\TagManager as DocBlockTagManager;
015 use Zend\Code\Scanner\DocBlockScanner;
016
017 class DocBlockReflection implements ReflectionInterface
018 {
019 /**
020 * @var Reflector
021 */
022 protected $reflector = null;
023
024 /**
025 * @var string
026 */
027 protected $docComment = null;
028
029 /**
030 * @var DocBlockTagManager
031 */
032 protected $tagManager = null;
033
034 /**#@+
035 * @var int
036 */
037 protected $startLine = null;
038 protected $endLine = null;
039 /**#@-*/
040
041 /**
042 * @var string
043 */
044 protected $cleanDocComment = null;
045
046 /**
047 * @var string
048 */
049 protected $longDescription = null;
050
051 /**
052 * @var string
053 */
054 protected $shortDescription = null;
055
056 /**
057 * @var array
058 */
059 protected $tags = array();
060
061 /**
062 * @var bool
063 */
064 protected $isReflected = false;
065
066 /**
067 * Export reflection
068 *
069 * Required by the Reflector interface.
070 *
071 * @todo What should this do?
072 * @return void
073 */
074 public static function export()
075 {
076 }
077
078 /**
079 * @param Reflector|string $commentOrReflector
080 * @param null|DocBlockTagManager $tagManager
081 * @throws Exception\InvalidArgumentException
082 * @return DocBlockReflection
083 */
084 public function __construct($commentOrReflector, DocBlockTagManager $tagManager = null)
085 {
086 if (!$tagManager) {
087 $tagManager = new DocBlockTagManager();
088 $tagManager->initializeDefaultTags();
089 }
090 $this->tagManager = $tagManager;
091
092 if ($commentOrReflector instanceof Reflector) {
093 $this->reflector = $commentOrReflector;
094 if (!method_exists($commentOrReflector, 'getDocComment')) {
095 throw new Exception\InvalidArgumentException('Reflector must contain method "getDocComment"');
096 }
097 /* @var MethodReflection $commentOrReflector */
098 $this->docComment = $commentOrReflector->getDocComment();
099
100 // determine line numbers
101 $lineCount = substr_count($this->docComment, "\n");
102 $this->startLine = $this->reflector->getStartLine() - $lineCount - 1;
103 $this->endLine = $this->reflector->getStartLine() - 1;
104 } elseif (is_string($commentOrReflector)) {
105 $this->docComment = $commentOrReflector;
106 } else {
107 throw new Exception\InvalidArgumentException(sprintf(
108 '%s must have a (string) DocComment or a Reflector in the constructor',
109 get_class($this)
110 ));
111 }
112
113 if ($this->docComment == '') {
114 throw new Exception\InvalidArgumentException('DocComment cannot be empty');
115 }
116
117 $this->reflect();
118 }
119
120 /**
121 * Retrieve contents of DocBlock
122 *
123 * @return string
124 */
125 public function getContents()
126 {
127 $this->reflect();
128
129 return $this->cleanDocComment;
130 }
131
132 /**
133 * Get start line (position) of DocBlock
134 *
135 * @return int
136 */
137 public function getStartLine()
138 {
139 $this->reflect();
140
141 return $this->startLine;
142 }
143
144 /**
145 * Get last line (position) of DocBlock
146 *
147 * @return int
148 */
149 public function getEndLine()
150 {
151 $this->reflect();
152
153 return $this->endLine;
154 }
155
156 /**
157 * Get DocBlock short description
158 *
159 * @return string
160 */
161 public function getShortDescription()
162 {
163 $this->reflect();
164
165 return $this->shortDescription;
166 }
167
168 /**
169 * Get DocBlock long description
170 *
171 * @return string
172 */
173 public function getLongDescription()
174 {
175 $this->reflect();
176
177 return $this->longDescription;
178 }
179
180 /**
181 * Does the DocBlock contain the given annotation tag?
182 *
183 * @param string $name
184 * @return bool
185 */
186 public function hasTag($name)
187 {
188 $this->reflect();
189 foreach ($this->tags as $tag) {
190 if ($tag->getName() == $name) {
191 return true;
192 }
193 }
194
195 return false;
196 }
197
198 /**
199 * Retrieve the given DocBlock tag
200 *
201 * @param string $name
202 * @return DocBlockTagInterface|false
203 */
204 public function getTag($name)
205 {
206 $this->reflect();
207 foreach ($this->tags as $tag) {
208 if ($tag->getName() == $name) {
209 return $tag;
210 }
211 }
212
213 return false;
214 }
215
216 /**
217 * Get all DocBlock annotation tags
218 *
219 * @param string $filter
220 * @return DocBlockTagInterface[]
221 */
222 public function getTags($filter = null)
223 {
224 $this->reflect();
225 if ($filter === null || !is_string($filter)) {
226 return $this->tags;
227 }
228
229 $returnTags = array();
230 foreach ($this->tags as $tag) {
231 if ($tag->getName() == $filter) {
232 $returnTags[] = $tag;
233 }
234 }
235
236 return $returnTags;
237 }
238
239 /**
240 * Parse the DocBlock
241 *
242 * @return void
243 */
244 protected function reflect()
245 {
246 if ($this->isReflected) {
247 return;
248 }
249
250 $docComment = preg_replace('#[ ]{0,1}\*/$#', '', $this->docComment);
251
252 // create a clean docComment
253 $this->cleanDocComment = preg_replace("#[ \t]*(?:/\*\*|\*/|\*)[ ]{0,1}(.*)?#", '$1', $docComment);
254 $this->cleanDocComment = ltrim($this->cleanDocComment, "\r\n"); // @todo should be changed to remove first and last empty line
255
256 $scanner = new DocBlockScanner($docComment);
257 $this->shortDescription = ltrim($scanner->getShortDescription());
258 $this->longDescription = ltrim($scanner->getLongDescription());
259
260 foreach ($scanner->getTags() as $tag) {
261 $this->tags[] = $this->tagManager->createTag(ltrim($tag['name'], '@'), ltrim($tag['value']));
262 }
263
264 $this->isReflected = true;
265 }
266
267 /**
268 * @return string
269 */
270 public function toString()
271 {
272 $str = "DocBlock [ /* DocBlock */ ] {" . PHP_EOL . PHP_EOL;
273 $str .= " - Tags [" . count($this->tags) . "] {" . PHP_EOL;
274
275 foreach ($this->tags as $tag) {
276 $str .= " " . $tag;
277 }
278
279 $str .= " }" . PHP_EOL;
280 $str .= "}" . PHP_EOL;
281
282 return $str;
283 }
284
285 /**
286 * Serialize to string
287 *
288 * Required by the Reflector interface
289 *
290 * @return string
291 */
292 public function __toString()
293 {
294 return $this->toString();
295 }
296 }
297