Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
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 |
Call.php
001 <?php
002
003 /*
004 * This file is part of Twig.
005 *
006 * (c) 2012 Fabien Potencier
007 *
008 * For the full copyright and license information, please view the LICENSE
009 * file that was distributed with this source code.
010 */
011 abstract class Twig_Node_Expression_Call extends Twig_Node_Expression
012 {
013 protected function compileCallable(Twig_Compiler $compiler)
014 {
015 $callable = $this->getAttribute('callable');
016
017 $closingParenthesis = false;
018 if ($callable) {
019 if (is_string($callable)) {
020 $compiler->raw($callable);
021 } elseif (is_array($callable) && $callable[0] instanceof Twig_ExtensionInterface) {
022 $compiler->raw(sprintf('$this->env->getExtension(\'%s\')->%s', $callable[0]->getName(), $callable[1]));
023 } else {
024 $type = ucfirst($this->getAttribute('type'));
025 $compiler->raw(sprintf('call_user_func_array($this->env->get%s(\'%s\')->getCallable(), array', $type, $this->getAttribute('name')));
026 $closingParenthesis = true;
027 }
028 } else {
029 $compiler->raw($this->getAttribute('thing')->compile());
030 }
031
032 $this->compileArguments($compiler);
033
034 if ($closingParenthesis) {
035 $compiler->raw(')');
036 }
037 }
038
039 protected function compileArguments(Twig_Compiler $compiler)
040 {
041 $compiler->raw('(');
042
043 $first = true;
044
045 if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
046 $compiler->raw('$this->env');
047 $first = false;
048 }
049
050 if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
051 if (!$first) {
052 $compiler->raw(', ');
053 }
054 $compiler->raw('$context');
055 $first = false;
056 }
057
058 if ($this->hasAttribute('arguments')) {
059 foreach ($this->getAttribute('arguments') as $argument) {
060 if (!$first) {
061 $compiler->raw(', ');
062 }
063 $compiler->string($argument);
064 $first = false;
065 }
066 }
067
068 if ($this->hasNode('node')) {
069 if (!$first) {
070 $compiler->raw(', ');
071 }
072 $compiler->subcompile($this->getNode('node'));
073 $first = false;
074 }
075
076 if ($this->hasNode('arguments') && null !== $this->getNode('arguments')) {
077 $callable = $this->hasAttribute('callable') ? $this->getAttribute('callable') : null;
078
079 $arguments = $this->getArguments($callable, $this->getNode('arguments'));
080
081 foreach ($arguments as $node) {
082 if (!$first) {
083 $compiler->raw(', ');
084 }
085 $compiler->subcompile($node);
086 $first = false;
087 }
088 }
089
090 $compiler->raw(')');
091 }
092
093 protected function getArguments($callable, $arguments)
094 {
095 $parameters = array();
096 $named = false;
097 foreach ($arguments as $name => $node) {
098 if (!is_int($name)) {
099 $named = true;
100 $name = $this->normalizeName($name);
101 } elseif ($named) {
102 throw new Twig_Error_Syntax(sprintf('Positional arguments cannot be used after named arguments for %s "%s".', $this->getAttribute('type'), $this->getAttribute('name')));
103 }
104
105 $parameters[$name] = $node;
106 }
107
108 if (!$named) {
109 return $parameters;
110 }
111
112 if (!$callable) {
113 throw new LogicException(sprintf('Named arguments are not supported for %s "%s".', $this->getAttribute('type'), $this->getAttribute('name')));
114 }
115
116 // manage named arguments
117 if (is_array($callable)) {
118 $r = new ReflectionMethod($callable[0], $callable[1]);
119 } elseif (is_object($callable) && !$callable instanceof Closure) {
120 $r = new ReflectionObject($callable);
121 $r = $r->getMethod('__invoke');
122 } else {
123 $r = new ReflectionFunction($callable);
124 }
125
126 $definition = $r->getParameters();
127 if ($this->hasNode('node')) {
128 array_shift($definition);
129 }
130 if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
131 array_shift($definition);
132 }
133 if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
134 array_shift($definition);
135 }
136 if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) {
137 foreach ($this->getAttribute('arguments') as $argument) {
138 array_shift($definition);
139 }
140 }
141
142 $arguments = array();
143 $pos = 0;
144 foreach ($definition as $param) {
145 $name = $this->normalizeName($param->name);
146
147 if (array_key_exists($name, $parameters)) {
148 if (array_key_exists($pos, $parameters)) {
149 throw new Twig_Error_Syntax(sprintf('Argument "%s" is defined twice for %s "%s".', $name, $this->getAttribute('type'), $this->getAttribute('name')));
150 }
151
152 $arguments[] = $parameters[$name];
153 unset($parameters[$name]);
154 } elseif (array_key_exists($pos, $parameters)) {
155 $arguments[] = $parameters[$pos];
156 unset($parameters[$pos]);
157 ++$pos;
158 } elseif ($param->isDefaultValueAvailable()) {
159 $arguments[] = new Twig_Node_Expression_Constant($param->getDefaultValue(), -1);
160 } elseif ($param->isOptional()) {
161 break;
162 } else {
163 throw new Twig_Error_Syntax(sprintf('Value for argument "%s" is required for %s "%s".', $name, $this->getAttribute('type'), $this->getAttribute('name')));
164 }
165 }
166
167 if (!empty($parameters)) {
168 throw new Twig_Error_Syntax(sprintf('Unknown argument%s "%s" for %s "%s".', count($parameters) > 1 ? 's' : '' , implode('", "', array_keys($parameters)), $this->getAttribute('type'), $this->getAttribute('name')));
169 }
170
171 return $arguments;
172 }
173
174 protected function normalizeName($name)
175 {
176 return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), $name));
177 }
178 }
179