1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15:
16: namespace TokenReflection\Php;
17:
18: use TokenReflection;
19: use TokenReflection\Broker, TokenReflection\Exception;
20: use Reflector, ReflectionParameter as InternalReflectionParameter, ReflectionFunctionAbstract as InternalReflectionFunctionAbstract;
21:
22: 23: 24: 25: 26:
27: class ReflectionParameter extends InternalReflectionParameter implements IReflection, TokenReflection\IReflectionParameter
28: {
29: 30: 31: 32: 33:
34: private $userDefined;
35:
36: 37: 38: 39: 40:
41: private $broker;
42:
43: 44: 45: 46: 47: 48: 49: 50:
51: public function __construct($function, $paramName, Broker $broker, InternalReflectionFunctionAbstract $parent)
52: {
53: parent::__construct($function, $paramName);
54: $this->broker = $broker;
55: $this->userDefined = $parent->isUserDefined();
56: }
57:
58: 59: 60: 61: 62:
63: public function getDeclaringClass()
64: {
65: $class = parent::getDeclaringClass();
66: return $class ? ReflectionClass::create($class, $this->broker) : null;
67: }
68:
69: 70: 71: 72: 73:
74: public function getDeclaringClassName()
75: {
76: $class = parent::getDeclaringClass();
77: return $class ? $class->getName() : null;
78: }
79:
80: 81: 82: 83: 84:
85: public function getNamespaceAliases()
86: {
87: return $this->getDeclaringFunction()->getNamespaceAliases();
88: }
89:
90: 91: 92: 93: 94:
95: public function getFileName()
96: {
97: return $this->getDeclaringFunction()->getFileName();
98: }
99:
100: 101: 102: 103: 104:
105: public function getExtension()
106: {
107: return $this->getDeclaringFunction()->getExtension();
108: }
109:
110: 111: 112: 113: 114:
115: public function getExtensionName()
116: {
117: $extension = $this->getExtension();
118: return $extension ? $extension->getName() : false;
119: }
120:
121: 122: 123: 124: 125: 126:
127: public function hasAnnotation($name)
128: {
129: return false;
130: }
131:
132: 133: 134: 135: 136: 137:
138: public function getAnnotation($name)
139: {
140: return null;
141: }
142:
143: 144: 145: 146: 147:
148: public function getAnnotations()
149: {
150: return array();
151: }
152:
153: 154: 155: 156: 157:
158: public function getDeclaringFunction()
159: {
160: $class = $this->getDeclaringClass();
161: $function = parent::getDeclaringFunction();
162:
163: return $class ? $class->getMethod($function->getName()) : ReflectionFunction::create($function, $this->broker);
164: }
165:
166: 167: 168: 169: 170:
171: public function getDeclaringFunctionName()
172: {
173: $function = parent::getDeclaringFunction();
174: return $function ? $function->getName() : $function;
175: }
176:
177: 178: 179: 180: 181:
182: public function getStartLine()
183: {
184: return null;
185: }
186:
187: 188: 189: 190: 191:
192: public function getEndLine()
193: {
194: return null;
195: }
196:
197: 198: 199: 200: 201:
202: public function ()
203: {
204: return false;
205: }
206:
207: 208: 209: 210: 211:
212: public function getDefaultValueDefinition()
213: {
214: $value = $this->getDefaultValue();
215: return null === $value ? null : var_export($value, true);
216: }
217:
218: 219: 220: 221: 222:
223: public function isCallable()
224: {
225: return PHP_VERSION >= 50400 && parent::isCallable();
226: }
227:
228: 229: 230: 231: 232:
233: public function getOriginalTypeHint()
234: {
235: return !$this->isArray() && !$this->isCallable() ? $this->getClass() : null;
236: }
237:
238: 239: 240: 241: 242:
243: public function getClassName()
244: {
245: return $this->getClass() ? $this->getClass()->getName() : null;
246: }
247:
248: 249: 250: 251: 252:
253: public function isInternal()
254: {
255: return !$this->userDefined;
256: }
257:
258: 259: 260: 261: 262:
263: public function isUserDefined()
264: {
265: return $this->userDefined;
266: }
267:
268: 269: 270: 271: 272:
273: public function isTokenized()
274: {
275: return false;
276: }
277:
278: 279: 280: 281: 282:
283: public function isDeprecated()
284: {
285: return false;
286: }
287:
288: 289: 290: 291: 292:
293: public function getBroker()
294: {
295: return $this->broker;
296: }
297:
298: 299: 300: 301: 302:
303: public function canBePassedByValue()
304: {
305: return method_exists($this, 'canBePassedByValue') ? parent::canBePassedByValue() : !$this->isPassedByReference();
306: }
307:
308: 309: 310: 311: 312:
313: public function getPrettyName()
314: {
315: return str_replace('()', '($' . $this->getName() . ')', $this->getDeclaringFunction()->getPrettyName());
316: }
317:
318: 319: 320: 321: 322: 323:
324: final public function __get($key)
325: {
326: return TokenReflection\ReflectionElement::get($this, $key);
327: }
328:
329: 330: 331: 332: 333: 334:
335: final public function __isset($key)
336: {
337: return TokenReflection\ReflectionElement::exists($this, $key);
338: }
339:
340: 341: 342: 343: 344: 345: 346: 347:
348: public static function create(Reflector $internalReflection, Broker $broker)
349: {
350: static $cache = array();
351:
352: if (!$internalReflection instanceof InternalReflectionParameter) {
353: throw new Exception\RuntimeException('Invalid reflection instance provided, ReflectionParameter expected.', Exception\RuntimeException::INVALID_ARGUMENT);
354: }
355:
356: $class = $internalReflection->getDeclaringClass();
357: $function = $internalReflection->getDeclaringFunction();
358:
359: $key = $class ? $class->getName() . '::' : '';
360: $key .= $function->getName() . '(' . $internalReflection->getName() . ')';
361:
362: if (!isset($cache[$key])) {
363: $cache[$key] = new self($class ? array($class->getName(), $function->getName()) : $function->getName(), $internalReflection->getName(), $broker, $function);
364: }
365:
366: return $cache[$key];
367: }
368: }
369: