1Valid usages of reserved keywords as identifiers
2-----
3<?php
4
5class Test {
6    function array() {}
7    function public() {}
8
9    static function list() {}
10    static function protected() {}
11
12    public $class;
13    public $private;
14
15    const TRAIT = 3, FINAL = 4;
16
17    const __CLASS__ = 1, __TRAIT__ = 2, __FUNCTION__ = 3, __METHOD__ = 4, __LINE__ = 5,
18          __FILE__ = 6, __DIR__ = 7, __NAMESPACE__ = 8;
19    // __halt_compiler does not work
20}
21
22$t = new Test;
23$t->array();
24$t->public();
25
26Test::list();
27Test::protected();
28
29$t->class;
30$t->private;
31
32Test::TRAIT;
33Test::FINAL;
34
35class Foo {
36    use TraitA, TraitB {
37        TraitA::catch insteadof namespace\TraitB;
38        TraitA::list as foreach;
39        TraitB::throw as protected public;
40        TraitB::self as protected;
41        exit as die;
42        \TraitC::exit as bye;
43        namespace\TraitC::exit as byebye;
44        TraitA::
45            //
46            /** doc comment */
47            #
48        catch /* comment */
49            // comment
50            # comment
51        insteadof TraitB;
52    }
53}
54-----
55array(
56    0: Stmt_Class(
57        attrGroups: array(
58        )
59        flags: 0
60        name: Identifier(
61            name: Test
62        )
63        extends: null
64        implements: array(
65        )
66        stmts: array(
67            0: Stmt_ClassMethod(
68                attrGroups: array(
69                )
70                flags: 0
71                byRef: false
72                name: Identifier(
73                    name: array
74                )
75                params: array(
76                )
77                returnType: null
78                stmts: array(
79                )
80            )
81            1: Stmt_ClassMethod(
82                attrGroups: array(
83                )
84                flags: 0
85                byRef: false
86                name: Identifier(
87                    name: public
88                )
89                params: array(
90                )
91                returnType: null
92                stmts: array(
93                )
94            )
95            2: Stmt_ClassMethod(
96                attrGroups: array(
97                )
98                flags: STATIC (8)
99                byRef: false
100                name: Identifier(
101                    name: list
102                )
103                params: array(
104                )
105                returnType: null
106                stmts: array(
107                )
108            )
109            3: Stmt_ClassMethod(
110                attrGroups: array(
111                )
112                flags: STATIC (8)
113                byRef: false
114                name: Identifier(
115                    name: protected
116                )
117                params: array(
118                )
119                returnType: null
120                stmts: array(
121                )
122            )
123            4: Stmt_Property(
124                attrGroups: array(
125                )
126                flags: PUBLIC (1)
127                type: null
128                props: array(
129                    0: PropertyItem(
130                        name: VarLikeIdentifier(
131                            name: class
132                        )
133                        default: null
134                    )
135                )
136            )
137            5: Stmt_Property(
138                attrGroups: array(
139                )
140                flags: PUBLIC (1)
141                type: null
142                props: array(
143                    0: PropertyItem(
144                        name: VarLikeIdentifier(
145                            name: private
146                        )
147                        default: null
148                    )
149                )
150            )
151            6: Stmt_ClassConst(
152                attrGroups: array(
153                )
154                flags: 0
155                type: null
156                consts: array(
157                    0: Const(
158                        name: Identifier(
159                            name: TRAIT
160                        )
161                        value: Scalar_Int(
162                            value: 3
163                        )
164                    )
165                    1: Const(
166                        name: Identifier(
167                            name: FINAL
168                        )
169                        value: Scalar_Int(
170                            value: 4
171                        )
172                    )
173                )
174            )
175            7: Stmt_ClassConst(
176                attrGroups: array(
177                )
178                flags: 0
179                type: null
180                consts: array(
181                    0: Const(
182                        name: Identifier(
183                            name: __CLASS__
184                        )
185                        value: Scalar_Int(
186                            value: 1
187                        )
188                    )
189                    1: Const(
190                        name: Identifier(
191                            name: __TRAIT__
192                        )
193                        value: Scalar_Int(
194                            value: 2
195                        )
196                    )
197                    2: Const(
198                        name: Identifier(
199                            name: __FUNCTION__
200                        )
201                        value: Scalar_Int(
202                            value: 3
203                        )
204                    )
205                    3: Const(
206                        name: Identifier(
207                            name: __METHOD__
208                        )
209                        value: Scalar_Int(
210                            value: 4
211                        )
212                    )
213                    4: Const(
214                        name: Identifier(
215                            name: __LINE__
216                        )
217                        value: Scalar_Int(
218                            value: 5
219                        )
220                    )
221                    5: Const(
222                        name: Identifier(
223                            name: __FILE__
224                        )
225                        value: Scalar_Int(
226                            value: 6
227                        )
228                    )
229                    6: Const(
230                        name: Identifier(
231                            name: __DIR__
232                        )
233                        value: Scalar_Int(
234                            value: 7
235                        )
236                    )
237                    7: Const(
238                        name: Identifier(
239                            name: __NAMESPACE__
240                        )
241                        value: Scalar_Int(
242                            value: 8
243                        )
244                    )
245                )
246            )
247            8: Stmt_Nop(
248                comments: array(
249                    0: // __halt_compiler does not work
250                )
251            )
252        )
253    )
254    1: Stmt_Expression(
255        expr: Expr_Assign(
256            var: Expr_Variable(
257                name: t
258            )
259            expr: Expr_New(
260                class: Name(
261                    name: Test
262                )
263                args: array(
264                )
265            )
266        )
267    )
268    2: Stmt_Expression(
269        expr: Expr_MethodCall(
270            var: Expr_Variable(
271                name: t
272            )
273            name: Identifier(
274                name: array
275            )
276            args: array(
277            )
278        )
279    )
280    3: Stmt_Expression(
281        expr: Expr_MethodCall(
282            var: Expr_Variable(
283                name: t
284            )
285            name: Identifier(
286                name: public
287            )
288            args: array(
289            )
290        )
291    )
292    4: Stmt_Expression(
293        expr: Expr_StaticCall(
294            class: Name(
295                name: Test
296            )
297            name: Identifier(
298                name: list
299            )
300            args: array(
301            )
302        )
303    )
304    5: Stmt_Expression(
305        expr: Expr_StaticCall(
306            class: Name(
307                name: Test
308            )
309            name: Identifier(
310                name: protected
311            )
312            args: array(
313            )
314        )
315    )
316    6: Stmt_Expression(
317        expr: Expr_PropertyFetch(
318            var: Expr_Variable(
319                name: t
320            )
321            name: Identifier(
322                name: class
323            )
324        )
325    )
326    7: Stmt_Expression(
327        expr: Expr_PropertyFetch(
328            var: Expr_Variable(
329                name: t
330            )
331            name: Identifier(
332                name: private
333            )
334        )
335    )
336    8: Stmt_Expression(
337        expr: Expr_ClassConstFetch(
338            class: Name(
339                name: Test
340            )
341            name: Identifier(
342                name: TRAIT
343            )
344        )
345    )
346    9: Stmt_Expression(
347        expr: Expr_ClassConstFetch(
348            class: Name(
349                name: Test
350            )
351            name: Identifier(
352                name: FINAL
353            )
354        )
355    )
356    10: Stmt_Class(
357        attrGroups: array(
358        )
359        flags: 0
360        name: Identifier(
361            name: Foo
362        )
363        extends: null
364        implements: array(
365        )
366        stmts: array(
367            0: Stmt_TraitUse(
368                traits: array(
369                    0: Name(
370                        name: TraitA
371                    )
372                    1: Name(
373                        name: TraitB
374                    )
375                )
376                adaptations: array(
377                    0: Stmt_TraitUseAdaptation_Precedence(
378                        trait: Name(
379                            name: TraitA
380                        )
381                        method: Identifier(
382                            name: catch
383                        )
384                        insteadof: array(
385                            0: Name_Relative(
386                                name: TraitB
387                            )
388                        )
389                    )
390                    1: Stmt_TraitUseAdaptation_Alias(
391                        trait: Name(
392                            name: TraitA
393                        )
394                        method: Identifier(
395                            name: list
396                        )
397                        newModifier: null
398                        newName: Identifier(
399                            name: foreach
400                        )
401                    )
402                    2: Stmt_TraitUseAdaptation_Alias(
403                        trait: Name(
404                            name: TraitB
405                        )
406                        method: Identifier(
407                            name: throw
408                        )
409                        newModifier: PROTECTED (2)
410                        newName: Identifier(
411                            name: public
412                        )
413                    )
414                    3: Stmt_TraitUseAdaptation_Alias(
415                        trait: Name(
416                            name: TraitB
417                        )
418                        method: Identifier(
419                            name: self
420                        )
421                        newModifier: PROTECTED (2)
422                        newName: null
423                    )
424                    4: Stmt_TraitUseAdaptation_Alias(
425                        trait: null
426                        method: Identifier(
427                            name: exit
428                        )
429                        newModifier: null
430                        newName: Identifier(
431                            name: die
432                        )
433                    )
434                    5: Stmt_TraitUseAdaptation_Alias(
435                        trait: Name_FullyQualified(
436                            name: TraitC
437                        )
438                        method: Identifier(
439                            name: exit
440                        )
441                        newModifier: null
442                        newName: Identifier(
443                            name: bye
444                        )
445                    )
446                    6: Stmt_TraitUseAdaptation_Alias(
447                        trait: Name_Relative(
448                            name: TraitC
449                        )
450                        method: Identifier(
451                            name: exit
452                        )
453                        newModifier: null
454                        newName: Identifier(
455                            name: byebye
456                        )
457                    )
458                    7: Stmt_TraitUseAdaptation_Precedence(
459                        trait: Name(
460                            name: TraitA
461                        )
462                        method: Identifier(
463                            name: catch
464                            comments: array(
465                                0: //
466                                1: /** doc comment */
467                                2: #
468                            )
469                        )
470                        insteadof: array(
471                            0: Name(
472                                name: TraitB
473                            )
474                        )
475                    )
476                )
477            )
478        )
479    )
480)
481