1. Allgemeines
Die Faustregel ist, dass gültige Variablennamen in PHP mit einem Buchstaben von a bis z oder einem Unterstrich (_) beginnen und danach (zweite Stelle und folgende) aus beliebig vielen Buchstaben (a bis z), Zahlen (0 bis 9) oder Unterstrichen bestehen. Der genaue reguläre Ausdruck lautet:
Beispiel:
<?php $example = 'bla'; $_temp = 'something'; $______ = 'gueltig'; $year2000 = 2000; ?>
Die Beschränkung auf bestimmte Zeichen kann umgangen werden indem man auf geschweifte Klammern zurückgreift:
<?php error_reporting(E_ALL); ${'$#?!'} = 'example'; var_dump(${'$#?!'}); ?>
string(7) "example"
2. Gültige erste und zweite Buchstaben
Bei „normaler” Definition der Variablen — also ohne geschweifte Klammern — sind die gültigen Buchstaben an erster und zweiter Stelle des Variablennamens in der nachfolgenden Tabelle dargestellt. Getestet wurden die ASCII-Zeichen 1 bis 255. Gültige Zeichen sind mit „OK” markiert, ungültige mit einem Minus („-”).
Nummer | Zeichen | Als erster Buchstabe |
Als zweiter Buchstabe |
---|---|---|---|
1 | - | - | |
2 | - | - | |
3 | - | - | |
4 | - | - | |
5 | - | - | |
6 | - | - | |
7 | - | - | |
8 | - | - | |
9 | - | OK | |
10 | - | OK | |
11 | - | - | |
12 | - | - | |
13 | - | OK | |
14 | - | - | |
15 | - | - | |
16 | - | - | |
17 | - | - | |
18 | - | - | |
19 | - | - | |
20 | - | - | |
21 | - | - | |
22 | - | - | |
23 | - | - | |
24 | - | - | |
25 | - | - | |
26 | - | - | |
27 | - | - | |
28 | - | - | |
29 | - | - | |
30 | - | - | |
31 | - | - | |
32 | - | OK | |
33 | ! | - | - |
34 | " | - | - |
35 | # | - | - |
36 | $ | - | - |
37 | % | - | - |
38 | & | - | - |
39 | ' | - | - |
40 | ( | - | - |
41 | ) | - | - |
42 | * | - | - |
43 | + | - | - |
44 | , | - | - |
45 | - | - | - |
46 | . | - | - |
47 | / | - | - |
48 | 0 | - | OK |
49 | 1 | - | OK |
50 | 2 | - | OK |
51 | 3 | - | OK |
52 | 4 | - | OK |
53 | 5 | - | OK |
54 | 6 | - | OK |
55 | 7 | - | OK |
56 | 8 | - | OK |
57 | 9 | - | OK |
58 | : | - | - |
59 | ; | - | - |
60 | < | - | - |
61 | = | - | - |
62 | > | - | - |
63 | ? | - | - |
64 | @ | - | - |
65 | A | OK | OK |
66 | B | OK | OK |
67 | C | OK | OK |
68 | D | OK | OK |
69 | E | OK | OK |
70 | F | OK | OK |
71 | G | OK | OK |
72 | H | OK | OK |
73 | I | OK | OK |
74 | J | OK | OK |
75 | K | OK | OK |
76 | L | OK | OK |
77 | M | OK | OK |
78 | N | OK | OK |
79 | O | OK | OK |
80 | P | OK | OK |
81 | Q | OK | OK |
82 | R | OK | OK |
83 | S | OK | OK |
84 | T | OK | OK |
85 | U | OK | OK |
86 | V | OK | OK |
87 | W | OK | OK |
88 | X | OK | OK |
89 | Y | OK | OK |
90 | Z | OK | OK |
91 | [ | - | - |
92 | \ | - | - |
93 | ] | - | - |
94 | ^ | - | - |
95 | _ | OK | OK |
96 | ` | - | - |
97 | a | OK | OK |
98 | b | OK | OK |
99 | c | OK | OK |
100 | d | OK | OK |
101 | e | OK | OK |
102 | f | OK | OK |
103 | g | OK | OK |
104 | h | OK | OK |
105 | i | OK | OK |
106 | j | OK | OK |
107 | k | OK | OK |
108 | l | OK | OK |
109 | m | OK | OK |
110 | n | OK | OK |
111 | o | OK | OK |
112 | p | OK | OK |
113 | q | OK | OK |
114 | r | OK | OK |
115 | s | OK | OK |
116 | t | OK | OK |
117 | u | OK | OK |
118 | v | OK | OK |
119 | w | OK | OK |
120 | x | OK | OK |
121 | y | OK | OK |
122 | z | OK | OK |
123 | { | - | - |
124 | | | - | - |
125 | } | - | - |
126 | ~ | - | - |
127 | | OK | OK |
128 | | OK | OK |
129 | | OK | OK |
130 | | OK | OK |
131 | | OK | OK |
132 | | OK | OK |
133 | OK | OK | |
134 | | OK | OK |
135 | | OK | OK |
136 | | OK | OK |
137 | | OK | OK |
138 | | OK | OK |
139 | | OK | OK |
140 | | OK | OK |
141 | | OK | OK |
142 | | OK | OK |
143 | | OK | OK |
144 | | OK | OK |
145 | | OK | OK |
146 | | OK | OK |
147 | | OK | OK |
148 | | OK | OK |
149 | | OK | OK |
150 | | OK | OK |
151 | | OK | OK |
152 | | OK | OK |
153 | | OK | OK |
154 | | OK | OK |
155 | | OK | OK |
156 | | OK | OK |
157 | | OK | OK |
158 | | OK | OK |
159 | | OK | OK |
160 | OK | OK | |
161 | ¡ | OK | OK |
162 | ¢ | OK | OK |
163 | £ | OK | OK |
164 | ¤ | OK | OK |
165 | ¥ | OK | OK |
166 | ¦ | OK | OK |
167 | § | OK | OK |
168 | ¨ | OK | OK |
169 | © | OK | OK |
170 | ª | OK | OK |
171 | « | OK | OK |
172 | ¬ | OK | OK |
173 | | OK | OK |
174 | ® | OK | OK |
175 | ¯ | OK | OK |
176 | ° | OK | OK |
177 | ± | OK | OK |
178 | ² | OK | OK |
179 | ³ | OK | OK |
180 | ´ | OK | OK |
181 | µ | OK | OK |
182 | ¶ | OK | OK |
183 | · | OK | OK |
184 | ¸ | OK | OK |
185 | ¹ | OK | OK |
186 | º | OK | OK |
187 | » | OK | OK |
188 | ¼ | OK | OK |
189 | ½ | OK | OK |
190 | ¾ | OK | OK |
191 | ¿ | OK | OK |
192 | À | OK | OK |
193 | Á | OK | OK |
194 | Â | OK | OK |
195 | Ã | OK | OK |
196 | Ä | OK | OK |
197 | Å | OK | OK |
198 | Æ | OK | OK |
199 | Ç | OK | OK |
200 | È | OK | OK |
201 | É | OK | OK |
202 | Ê | OK | OK |
203 | Ë | OK | OK |
204 | Ì | OK | OK |
205 | Í | OK | OK |
206 | Î | OK | OK |
207 | Ï | OK | OK |
208 | Ð | OK | OK |
209 | Ñ | OK | OK |
210 | Ò | OK | OK |
211 | Ó | OK | OK |
212 | Ô | OK | OK |
213 | Õ | OK | OK |
214 | Ö | OK | OK |
215 | × | OK | OK |
216 | Ø | OK | OK |
217 | Ù | OK | OK |
218 | Ú | OK | OK |
219 | Û | OK | OK |
220 | Ü | OK | OK |
221 | Ý | OK | OK |
222 | Þ | OK | OK |
223 | ß | OK | OK |
224 | à | OK | OK |
225 | á | OK | OK |
226 | â | OK | OK |
227 | ã | OK | OK |
228 | ä | OK | OK |
229 | å | OK | OK |
230 | æ | OK | OK |
231 | ç | OK | OK |
232 | è | OK | OK |
233 | é | OK | OK |
234 | ê | OK | OK |
235 | ë | OK | OK |
236 | ì | OK | OK |
237 | í | OK | OK |
238 | î | OK | OK |
239 | ï | OK | OK |
240 | ð | OK | OK |
241 | ñ | OK | OK |
242 | ò | OK | OK |
243 | ó | OK | OK |
244 | ô | OK | OK |
245 | õ | OK | OK |
246 | ö | OK | OK |
247 | ÷ | OK | OK |
248 | ø | OK | OK |
249 | ù | OK | OK |
250 | ú | OK | OK |
251 | û | OK | OK |
252 | ü | OK | OK |
253 | ý | OK | OK |
254 | þ | OK | OK |
255 | ÿ | OK | OK |
Die Tabelle wird mit dem nachfolgenden Skript generiert. Voraussetzung ist, dass es im Verzeichnis in dem es liegt, in die Dateien „nametest1.php” und „nametest2.php” schreiben und diese über die URLs „http://www.phptest.local/nametest1.php” und „http://www.phptest.local/nametest2.php” aufrufen kann (hosts-Datei sollte entsprechend abgeändert werden). Zur Funktionsweise: Das Skript generiert für jeden der ASCII-Buchstaben zwischen 1 und 255 je eine Datei in der der Buchstabe an erster Stelle einer Variable steht und eine in der er an zweiter Stelle steht. Beide Dateien werden per URL aufgerufen, sodass Fehler beim Aufruf der Dateien nicht das „Hauptskript” beeinträchtigen. Sollte das ASCII-Zeichen an erster und/oder zweiter Stelle ungültig sein, wird eine Fehlermeldung (Notice, Warning oder Error) bei Aufruf der jeweiligen Datei erzeugt. Es wird auf eine solche Fehlermeldung geprüft und das Zeichen gegebenenfalls als ungültig markiert. (Bereits eine Notice bei Verwendung des Zeichens an erster oder zweiter Stelle sorgt daher dafür, dass das Zeichen hier als ungültig gilt.)
<?php error_reporting(E_ALL); mb_internal_encoding('UTF-8'); define('BASE_URL', 'http://www.phptest.local/'); function isContainingError($str) { return preg_match('/(error|warning|notice)/', strtolower($str)); } $filecontents = '<?php error_reporting(E_ALL); $%name = \'example\'; echo $%name; ?>'; $results = array(); for ($x=1; $x<=255; $x++) { $char = chr($x); $name1 = $char.'a'; $name2 = 'a'.$char; $content1 = str_replace('%name', $name1, $filecontents); $content2 = str_replace('%name', $name2, $filecontents); file_put_contents('nametest1.php', $content1); file_put_contents('nametest2.php', $content2); $result1 = file_get_contents(BASE_URL . 'nametest1.php'); $result2 = file_get_contents(BASE_URL . 'nametest2.php'); $results[$x] = array(!isContainingError($result1), !isContainingError($result2)); } ?> <table id="php-nametest"> <thead> <tr> <th>Nummer</th> <th>Zeichen</th> <th>Als erster<br />Buchstabe</th> <th>Als zweiter<br />Buchstabe</th> </tr> </thead> <tbody> <?php foreach ($results as $chrNumber=>$boolArr) { $chr = chr($chrNumber); $isValidAsFirstChar = $boolArr[0]; $isValidAsSecondChar = $boolArr[1]; echo('<tr>' .'<td>' . $chrNumber .'</td>' .'<td>&#' . $chrNumber .';</td>' .'<td>' . ($isValidAsFirstChar ? 'OK' : '-') . '</td>' .'<td>' . ($isValidAsSecondChar ? 'OK' : '-') . '</td>' .'</tr>'."\n"); } ?> </tbody> </table>