Mercurial > hg > isophonics-drupal-site
comparison vendor/psy/psysh/src/Reflection/ReflectionClassConstant.php @ 16:c2387f117808
Routine composer update
author | Chris Cannam |
---|---|
date | Tue, 10 Jul 2018 15:07:59 +0100 |
parents | |
children | 129ea1e6d783 |
comparison
equal
deleted
inserted
replaced
15:e200cb7efeb3 | 16:c2387f117808 |
---|---|
1 <?php | |
2 | |
3 /* | |
4 * This file is part of Psy Shell. | |
5 * | |
6 * (c) 2012-2018 Justin Hileman | |
7 * | |
8 * For the full copyright and license information, please view the LICENSE | |
9 * file that was distributed with this source code. | |
10 */ | |
11 | |
12 namespace Psy\Reflection; | |
13 | |
14 /** | |
15 * Somehow the standard reflection library didn't include class constants until 7.1. | |
16 * | |
17 * ReflectionClassConstant corrects that omission. | |
18 */ | |
19 class ReflectionClassConstant implements \Reflector | |
20 { | |
21 public $class; | |
22 public $name; | |
23 private $value; | |
24 | |
25 /** | |
26 * Construct a ReflectionClassConstant object. | |
27 * | |
28 * @param string|object $class | |
29 * @param string $name | |
30 */ | |
31 public function __construct($class, $name) | |
32 { | |
33 if (!$class instanceof \ReflectionClass) { | |
34 $class = new \ReflectionClass($class); | |
35 } | |
36 | |
37 $this->class = $class; | |
38 $this->name = $name; | |
39 | |
40 $constants = $class->getConstants(); | |
41 if (!array_key_exists($name, $constants)) { | |
42 throw new \InvalidArgumentException('Unknown constant: ' . $name); | |
43 } | |
44 | |
45 $this->value = $constants[$name]; | |
46 } | |
47 | |
48 /** | |
49 * Exports a reflection. | |
50 * | |
51 * @param string|object $class | |
52 * @param string $name | |
53 * @param bool $return pass true to return the export, as opposed to emitting it | |
54 * | |
55 * @return null|string | |
56 */ | |
57 public static function export($class, $name, $return = false) | |
58 { | |
59 $refl = new self($class, $name); | |
60 $value = $refl->getValue(); | |
61 | |
62 $str = sprintf('Constant [ public %s %s ] { %s }', gettype($value), $refl->getName(), $value); | |
63 | |
64 if ($return) { | |
65 return $str; | |
66 } | |
67 | |
68 echo $str . "\n"; | |
69 } | |
70 | |
71 /** | |
72 * Gets the declaring class. | |
73 * | |
74 * @return \ReflectionClass | |
75 */ | |
76 public function getDeclaringClass() | |
77 { | |
78 $parent = $this->class; | |
79 | |
80 // Since we don't have real reflection constants, we can't see where | |
81 // it's actually defined. Let's check for a constant that is also | |
82 // available on the parent class which has exactly the same value. | |
83 // | |
84 // While this isn't _technically_ correct, it's prolly close enough. | |
85 do { | |
86 $class = $parent; | |
87 $parent = $class->getParentClass(); | |
88 } while ($parent && $parent->hasConstant($this->name) && $parent->getConstant($this->name) === $this->value); | |
89 | |
90 return $class; | |
91 } | |
92 | |
93 /** | |
94 * Get the constant's docblock. | |
95 * | |
96 * @return false | |
97 */ | |
98 public function getDocComment() | |
99 { | |
100 return false; | |
101 } | |
102 | |
103 /** | |
104 * Gets the class constant modifiers. | |
105 * | |
106 * Since this is only used for PHP < 7.1, we can just return "public". All | |
107 * the fancier modifiers are only available on PHP versions which have their | |
108 * own ReflectionClassConstant class :) | |
109 * | |
110 * @return int | |
111 */ | |
112 public function getModifiers() | |
113 { | |
114 return \ReflectionMethod::IS_PUBLIC; | |
115 } | |
116 | |
117 /** | |
118 * Gets the constant name. | |
119 * | |
120 * @return string | |
121 */ | |
122 public function getName() | |
123 { | |
124 return $this->name; | |
125 } | |
126 | |
127 /** | |
128 * Gets the value of the constant. | |
129 * | |
130 * @return mixed | |
131 */ | |
132 public function getValue() | |
133 { | |
134 return $this->value; | |
135 } | |
136 | |
137 /** | |
138 * Checks if class constant is private. | |
139 * | |
140 * @return bool false | |
141 */ | |
142 public function isPrivate() | |
143 { | |
144 return false; | |
145 } | |
146 | |
147 /** | |
148 * Checks if class constant is protected. | |
149 * | |
150 * @return bool false | |
151 */ | |
152 public function isProtected() | |
153 { | |
154 return false; | |
155 } | |
156 | |
157 /** | |
158 * Checks if class constant is public. | |
159 * | |
160 * @return bool true | |
161 */ | |
162 public function isPublic() | |
163 { | |
164 return true; | |
165 } | |
166 | |
167 /** | |
168 * To string. | |
169 * | |
170 * @return string | |
171 */ | |
172 public function __toString() | |
173 { | |
174 return $this->getName(); | |
175 } | |
176 | |
177 /** | |
178 * Gets the constant's file name. | |
179 * | |
180 * Currently returns null, because if it returns a file name the signature | |
181 * formatter will barf. | |
182 */ | |
183 public function getFileName() | |
184 { | |
185 return; | |
186 // return $this->class->getFileName(); | |
187 } | |
188 | |
189 /** | |
190 * Get the code start line. | |
191 * | |
192 * @throws \RuntimeException | |
193 */ | |
194 public function getStartLine() | |
195 { | |
196 throw new \RuntimeException('Not yet implemented because it\'s unclear what I should do here :)'); | |
197 } | |
198 | |
199 /** | |
200 * Get the code end line. | |
201 * | |
202 * @throws \RuntimeException | |
203 */ | |
204 public function getEndLine() | |
205 { | |
206 return $this->getStartLine(); | |
207 } | |
208 | |
209 /** | |
210 * Get a ReflectionClassConstant instance. | |
211 * | |
212 * In PHP >= 7.1, this will return a \ReflectionClassConstant from the | |
213 * standard reflection library. For older PHP, it will return this polyfill. | |
214 * | |
215 * @param string|object $class | |
216 * @param string $name | |
217 * | |
218 * @return ReflectionClassConstant|\ReflectionClassConstant | |
219 */ | |
220 public static function create($class, $name) | |
221 { | |
222 if (class_exists('\\ReflectionClassConstant')) { | |
223 return new \ReflectionClassConstant($class, $name); | |
224 } | |
225 | |
226 return new self($class, $name); | |
227 } | |
228 } |