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 |
CallbackHandler.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\Stdlib;
011
012 use ReflectionClass;
013
014 /**
015 * CallbackHandler
016 *
017 * A handler for an event, event, filterchain, etc. Abstracts PHP callbacks,
018 * primarily to allow for lazy-loading and ensuring availability of default
019 * arguments (currying).
020 */
021 class CallbackHandler
022 {
023 /**
024 * @var string|array|callable PHP callback to invoke
025 */
026 protected $callback;
027
028 /**
029 * Callback metadata, if any
030 * @var array
031 */
032 protected $metadata;
033
034 /**
035 * PHP version is greater as 5.4rc1?
036 * @var bool
037 */
038 protected static $isPhp54;
039
040 /**
041 * Constructor
042 *
043 * @param string|array|object|callable $callback PHP callback
044 * @param array $metadata Callback metadata
045 */
046 public function __construct($callback, array $metadata = array())
047 {
048 $this->metadata = $metadata;
049 $this->registerCallback($callback);
050 }
051
052 /**
053 * Registers the callback provided in the constructor
054 *
055 * @param callable $callback
056 * @throws Exception\InvalidCallbackException
057 * @return void
058 */
059 protected function registerCallback($callback)
060 {
061 if (!is_callable($callback)) {
062 throw new Exception\InvalidCallbackException('Invalid callback provided; not callable');
063 }
064
065 $this->callback = $callback;
066 }
067
068 /**
069 * Retrieve registered callback
070 *
071 * @return callable
072 */
073 public function getCallback()
074 {
075 return $this->callback;
076 }
077
078 /**
079 * Invoke handler
080 *
081 * @param array $args Arguments to pass to callback
082 * @return mixed
083 */
084 public function call(array $args = array())
085 {
086 $callback = $this->getCallback();
087
088 // Minor performance tweak, if the callback gets called more than once
089 if (!isset(static::$isPhp54)) {
090 static::$isPhp54 = version_compare(PHP_VERSION, '5.4.0rc1', '>=');
091 }
092
093 $argCount = count($args);
094
095 if (static::$isPhp54 && is_string($callback)) {
096 $result = $this->validateStringCallbackFor54($callback);
097
098 if ($result !== true && $argCount <= 3) {
099 $callback = $result;
100 // Minor performance tweak, if the callback gets called more
101 // than once
102 $this->callback = $result;
103 }
104 }
105
106 // Minor performance tweak; use call_user_func() until > 3 arguments
107 // reached
108 switch ($argCount) {
109 case 0:
110 if (static::$isPhp54) {
111 return $callback();
112 }
113 return call_user_func($callback);
114 case 1:
115 if (static::$isPhp54) {
116 return $callback(array_shift($args));
117 }
118 return call_user_func($callback, array_shift($args));
119 case 2:
120 $arg1 = array_shift($args);
121 $arg2 = array_shift($args);
122 if (static::$isPhp54) {
123 return $callback($arg1, $arg2);
124 }
125 return call_user_func($callback, $arg1, $arg2);
126 case 3:
127 $arg1 = array_shift($args);
128 $arg2 = array_shift($args);
129 $arg3 = array_shift($args);
130 if (static::$isPhp54) {
131 return $callback($arg1, $arg2, $arg3);
132 }
133 return call_user_func($callback, $arg1, $arg2, $arg3);
134 default:
135 return call_user_func_array($callback, $args);
136 }
137 }
138
139 /**
140 * Invoke as functor
141 *
142 * @return mixed
143 */
144 public function __invoke()
145 {
146 return $this->call(func_get_args());
147 }
148
149 /**
150 * Get all callback metadata
151 *
152 * @return array
153 */
154 public function getMetadata()
155 {
156 return $this->metadata;
157 }
158
159 /**
160 * Retrieve a single metadatum
161 *
162 * @param string $name
163 * @return mixed
164 */
165 public function getMetadatum($name)
166 {
167 if (array_key_exists($name, $this->metadata)) {
168 return $this->metadata[$name];
169 }
170 return;
171 }
172
173 /**
174 * Validate a static method call
175 *
176 * Validates that a static method call in PHP 5.4 will actually work
177 *
178 * @param string $callback
179 * @return true|array
180 * @throws Exception\InvalidCallbackException if invalid
181 */
182 protected function validateStringCallbackFor54($callback)
183 {
184 if (!strstr($callback, '::')) {
185 return true;
186 }
187
188 list($class, $method) = explode('::', $callback, 2);
189
190 if (!class_exists($class)) {
191 throw new Exception\InvalidCallbackException(sprintf(
192 'Static method call "%s" refers to a class that does not exist',
193 $callback
194 ));
195 }
196
197 $r = new ReflectionClass($class);
198 if (!$r->hasMethod($method)) {
199 throw new Exception\InvalidCallbackException(sprintf(
200 'Static method call "%s" refers to a method that does not exist',
201 $callback
202 ));
203 }
204 $m = $r->getMethod($method);
205 if (!$m->isStatic()) {
206 throw new Exception\InvalidCallbackException(sprintf(
207 'Static method call "%s" refers to a method that is not static',
208 $callback
209 ));
210 }
211
212 // returning a non boolean value may not be nice for a validate method,
213 // but that allows the usage of a static string callback without using
214 // the call_user_func function.
215 return array($class, $method);
216 }
217 }
218