source: trunk/devel/sample.cpp.php @ 1488

Last change on this file since 1488 was 1488, checked in by moo, 4 months ago

Decompiler PHP_5_6: updated support for zend_ast

  • Property svn:eol-style set to native
File size: 11.4 KB
Line 
1<?php
2#if PHP_VERSION >= 500
3#   define PublicMethod public
4#else
5#   define ClassName classname
6#   define PublicMethod
7#   define abstract
8#   define innerIf_ innerif_
9#   define emptySwitch emptyswitch
10#   define defaultSwitch defaultswitch
11#endif
12#if PHP_VERSION >= 520
13#else
14#   define __callStatic __callstatic
15#   define __toString __tostring
16#endif
17#if PHP_VERSION >= 530
18
19namespace ns;
20#define _Exception \Exception
21#endif
22
23abstract class ClassName
24{
25#if PHP_VERSION >= 500
26    const CONST_VALUE = 'A constant value';
27
28    /** doc */
29    static public $static = array(
30        0           => array('array'),
31        1           => 'str',
32        CONST_VALUE => CONST_VALUE
33        );
34    static public $classProp;
35    static public $static_const1 = CONST_VALUE;
36    static public $static_const2 = self::CONST_VALUE;
37    static public $static_const3 = ClassName::CONST_VALUE;
38    static public $static_const4 = array(CONST_VALUE => 'test');
39    static public $static_const5 = array(self::CONST_VALUE => 'test');
40    static public $static_const6 = array(ClassName::CONST_VALUE => 'test');
41    static public $static_const7 = array('test' => CONST_VALUE);
42    static public $static_const8 = array('test' => self::CONST_VALUE);
43    static public $static_const9 = array('test' => ClassName::CONST_VALUE);
44    static public $static_const10 = array(CONST_VALUE => CONST_VALUE);
45    static public $static_const11 = array(self::CONST_VALUE => self::CONST_VALUE);
46    static public $static_const12 = array(ClassName::CONST_VALUE => ClassName::CONST_VALUE);
47    static public $ast_binop = ClassName::CONST_VALUE + ClassName::CONST_VALUE;
48    static public $ast_and = ClassName::CONST_VALUE && 1;
49    static public $ast_or = ClassName::CONST_VALUE || 2;
50    static public $ast_select = ClassName::CONST_VALUE ? a : b;
51    static public $ast_unaryPlus = +ClassName::CONST_VALUE;
52    static public $ast_unaryMinus = -ClassName::CONST_VALUE;
53    /** doc */
54    static public $public_static = array(2, 'str');
55    /** doc */
56    static private $private_static = array(2, 'str');
57    static private $private_static2 = array(self::CONST_VALUE => self::CONST_VALUE);
58    /** doc */
59    static protected $protected_static = array(2, 'str');
60    static protected $protected_static2 = array(self::CONST_VALUE => self::CONST_VALUE);
61    /** doc */
62    public $property = array(
63        array('array'),
64        'str'
65        );
66    /** doc */
67    public $public_property = array(2, 'str');
68    /** doc */
69    private $private_property = array(2, 'str');
70    /** doc */
71    protected $protected_property = array(2, 'str');
72    public $array = array();
73#else
74    var $property = array(
75        array('array'),
76        'str'
77        );
78#endif
79
80#if PHP_VERSION >= 500
81    /** doc */
82#endif
83    PublicMethod function f1()
84    {
85    }
86
87    PublicMethod function f2()
88    {
89    }
90
91    PublicMethod function __construct($arg1, $arg2)
92    {
93        static $array = array(
94            0           => array('array'),
95            1           => 'str',
96            CONST_VALUE => CONST_VALUE
97            );
98        static $static = 1;
99        static $str = 'string';
100        echo CONST_VALUE;
101#if PHP_VERSION >= 500
102        echo ClassName::CONST_VALUE;
103        empty(ClassName::$classProp);
104        isset(ClassName::$classProp);
105        ClassName::$classProp = 1;
106        echo ClassName::$classProp;
107#endif
108        $object = $this;
109        $object->a = 1;
110        $object->b = 2;
111        $object->prop = 'prop';
112        empty($object->objProp);
113        isset($object->objProp);
114#if PHP_VERSION >= 500
115        unset($object->objProp);
116#endif
117        $object->objProp = 1;
118        echo $object->objProp;
119        empty($this->thisProp);
120        isset($this->thisProp);
121#if PHP_VERSION >= 500
122        unset($this->thisProp);
123#endif
124        $this->thisProp = 1;
125        echo $this->thisProp;
126#if PHP_VERSION >= 500
127        unset($array['index']->valueProp);
128#endif
129        unset($object->array['index']);
130        unset($this->array['index']);
131        empty($_GET['get']);
132        isset($_GET['get']);
133        unset($_GET['get']);
134        $_GET['get'] = 1;
135        echo $_GET['get'];
136        isset($GLOBALS['global']);
137        empty($GLOBALS['global']);
138        unset($GLOBALS['global']);
139        $GLOBALS['global'] = 1;
140        echo $GLOBALS['global'];
141        empty($array['index']);
142        isset($array['index']);
143        unset($array['index']);
144        $array['index'] = 1;
145        echo $array['index'];
146        empty($array['index']->indexProp);
147        isset($array['index']->indexProp);
148#if PHP_VERSION >= 500
149        unset($array['index']->indexProp);
150#endif
151        $array['index'] = $object;
152        $array['index']->indexProp = 1;
153        echo $array['index']->indexProp;
154        $GLOBALS['var'] = $object;
155        empty($GLOBALS['var']->indexProp);
156        isset($GLOBALS['var']->indexProp);
157#if PHP_VERSION >= 500
158        unset($GLOBALS['var']->indexProp);
159#endif
160        $GLOBALS['var']->indexProp = 1;
161        echo $GLOBALS['var']->indexProp;
162
163        if (0) {
164            ClassName::__construct();
165        }
166
167        $method = 'method';
168        ClassName::$method();
169        echo __CLASS__;
170        echo __METHOD__;
171        echo __FUNCTION__;
172        $this->method();
173
174#if PHP_VERSION >= 500
175        try {
176            throw new _Exception();
177            new _Exception();
178        }
179        catch (_Exception $e) {
180        }
181#endif
182
183        $a = 1;
184        $b = $c = 2;
185        $a = $b + $c;
186        $a = $b + 1;
187        $a = 1 + $b;
188        $a = $b - $c;
189        $a = $b * $c;
190        $a = $b / $c;
191        $a = $b % $c;
192        $a = $b . $c;
193        $a = $b = $c;
194        $a = $b & $c;
195        $a = $b | $c;
196        $a = $b ^ $c;
197        $a = ~$b;
198        $a = -$b;
199        $a = +$b;
200        $a = $b >> $c;
201        $a = $b >> $c;
202        $a = $b == $c;
203        $a = $b === $c;
204        $a = $b != $c;
205        $a = $b < $c;
206        $a = $b <= $c;
207        $a = $b <= $c;
208        $a = $b++;
209        $a = ++$b;
210        $a = $object->b++;
211        $a = ++$object->b;
212        $a = $b--;
213        $a = --$b;
214        $a = $object->b--;
215        $a = --$object->b;
216        $a = !$b;
217        $a = $b === $c;
218        $a = $b !== $c;
219        $a = $b << 2;
220        $a = $b >> 3;
221        $a += $b;
222        $a -= $b;
223        $a *= $b;
224        $a /= $b;
225        $a <<= $b;
226        $a >>= $b;
227        $a &= $b;
228        $a |= $b;
229        $a .= $b;
230        $a %= $b;
231        $a ^= $b;
232        $a = 'a' . 'b';
233        $a = 'a' . 'abc';
234        @f1();
235        print('1');
236        $array = array('index' => 1);
237        $a = $array['index'];
238        $a = $object->prop;
239        $a = $this->prop;
240        $array['index'] = 1;
241        $object->prop = 1;
242        $this->prop = 1;
243        $a = isset($b);
244        $a = empty($b);
245        unset($b);
246        $b = 1;
247        $a = isset($array['index']);
248        $a = empty($array['index']);
249        unset($array['index']);
250        $a = isset($object->prop);
251        $a = empty($object->prop);
252#if PHP_VERSION >= 500
253        unset($object->prop);
254#endif
255        $a = isset($this->prop);
256        $a = empty($this->prop);
257#if PHP_VERSION >= 500
258        unset($this->prop);
259        $a = isset(ClassName::$prop);
260        $a = empty(ClassName::$prop);
261#endif
262        $a = (int) $b;
263        $a = (double) $b;
264        $a = (string) $b;
265        $a = (array) $b;
266        $a = (object) $b;
267        $a = (bool) $b;
268        $a = (unset) $b;
269        $a = (array) $b;
270        $a = (object) $b;
271        $a = ($b ? $c : $d);
272        $a = (f1() ? f2() : f3());
273        ($a = $b) xor $c;
274        ($a = $b) and $c;
275        ($a = $b) or $c;
276        $a = $b && $c;
277        $a = $b || $c;
278#if PHP_VERSION >= 530
279        echo $this::CONST_VALUE;
280        echo $object::CONST_VALUE;
281        echo CONST_VALUE;
282        $this::method();
283        $object::method();
284        $a = $b ?: $d;
285        $a = ($b ?: $d) + $c;
286        $a = f1() ?: f2();
287        $a = ClassName::f1() ?: ClassName::f2();
288        $a = ($b ? $c : $d);
289        $a = ($b ? $c : $d) + $c;
290        $a = (f1() ? f3() : f2());
291
292        if ($b ?: $d) {
293            echo 'if ($b ?: $d)';
294        }
295
296        if (($b ?: $d) + $c) {
297            echo 'if (($b ?: $d) + $c)';
298        }
299
300        if (f1() ?: f2()) {
301            echo 'if (f1() ?: f2())';
302        }
303#endif
304    }
305
306    public function __destruct()
307    {
308    }
309#if PHP_VERSION >= 500
310
311    /** doc */
312    abstract public function abstractMethod();
313#endif
314
315#if PHP_VERSION >= 500
316    /** doc */
317#endif
318    PublicMethod function method($a = NULL, $b = NULL)
319    {
320    }
321#if PHP_VERSION >= 500
322
323    /** doc */
324    protected function protectedMethod(ClassName $a, $b = array(
325            array('array')
326            ))
327    {
328        $runtimeArray = array('1');
329        $runtimeArray2 = array(
330            '1',
331            array()
332            );
333        $runtimeArray3 = array(
334            'a' => '1',
335            2   => array()
336            );
337        return 'protected';
338    }
339
340    /** doc */
341    private function privateMethod(ClassName $a, $b = NULL)
342    {
343        return 'private';
344    }
345#endif
346}
347#if PHP_VERSION >= 500
348
349interface IInterface
350{
351    public function nothing();
352}
353#endif
354
355function f1()
356{
357}
358
359function f2()
360{
361}
362
363function f3()
364{
365}
366
367function generator($f)
368{
369    echo __FUNCTION__;
370    echo $f;
371#if PHP_VERSION >= 550
372
373    foreach ($a as $b) {
374        yield $b;
375    }
376
377    yield f1($b);
378#endif
379}
380#if PHP_VERSION >= 500
381
382final class Child extends ClassName implements IInterface
383{
384    public function __construct()
385    {
386        parent::__construct('a', 'b');
387    }
388
389    public function __destruct()
390    {
391        parent::__destruct();
392    }
393
394    static public function __callStatic($name, $args)
395    {
396        parent::__callStatic($name, $args);
397    }
398
399    public function abstractMethod()
400    {
401    }
402
403    public function nothing()
404    {
405    }
406
407    public function __toString()
408    {
409        parent::__toString();
410    }
411
412    public function __set($name, $value)
413    {
414    }
415
416    public function __get($name)
417    {
418    }
419
420    public function __isset($name)
421    {
422    }
423
424    public function __unset($name)
425    {
426    }
427
428    public function __sleep()
429    {
430    }
431
432    public function __wakeup()
433    {
434    }
435
436    public function __clone()
437    {
438        return array();
439    }
440}
441#endif
442
443define('CONST_VALUE', 'const value');
444$late = isset($_ENV['LATE']);
445
446if ($late) {
447    class LateBindingClass
448    {
449        PublicMethod function __construct()
450        {
451        }
452    }
453
454    function lateBindingFunction($arg)
455    {
456        echo 'lateFunction';
457        return new lateBindingFunction();
458    }
459}
460
461echo "\r\n";
462echo "\r";
463echo "\n";
464var_dump(array('a' => 'a', 'b' => 'c'), 'b');
465$object = new Child();
466$className = 'ns\\Child';
467$object = new $className();
468#if PHP_VERSION >= 500
469$result = $object instanceof Child;
470$cloned = clone $object;
471#endif
472#if PHP_VERSION >= 500
473
474do {
475    try {
476        echo 'outer try 1';
477
478        try {
479            echo 'inner try';
480        }
481        catch (InnerException $e) {
482            echo $e;
483        }
484        catch (InnerException2 $e2) {
485            echo $e2;
486        }
487#if PHP_VERSION >= 550
488        finally {
489            echo 'inner finally';
490        }
491#endif
492
493        echo 'outer try 2';
494    }
495    catch (OuterException $e) {
496        echo $e;
497    }
498    catch (OuterException2 $e2) {
499        echo $e2;
500    }
501#if PHP_VERSION >= 550
502    finally {
503        echo 'outer finally';
504    }
505#endif
506} while (0);
507#endif
508
509if ('if()') {
510    echo 'if';
511
512    if ('innerIf()') {
513        echo 'if innerIf';
514    }
515}
516else if ('elseif_()') {
517    echo 'else if';
518
519    if ('innerIf_()') {
520        echo 'if innerIf';
521    }
522}
523else {
524    if ('innerIf_()') {
525        echo 'if innerIf';
526    }
527
528    echo 'else';
529}
530
531while (false) {
532    echo 'while';
533}
534
535do {
536    echo 'do/while';
537} while (false);
538
539$i = 1;
540
541for (; $i < 10; ++$i) {
542    echo $i;
543    break;
544}
545
546$array = array(
547    array('a' => 'b')
548    );
549
550foreach ($array as $value) {
551    foreach ($value as $key => $value) {
552        echo $key . ' = ' . $value . "\n";
553        break 2;
554        continue;
555    }
556}
557
558switch ('$normalSwitch') {
559case 'case1':
560    echo 'case1';
561
562    switch ('$nestedSwitch') {
563    case 1:
564    }
565
566    break;
567
568case 'case2':
569    echo 'case2';
570    break;
571
572default:
573    switch ('$nestedSwitch') {
574    case 1:
575    }
576
577    echo 'default';
578    break;
579}
580
581switch ('$switchWithoutDefault') {
582case 'case1':
583    echo 'case1';
584    break;
585
586case 'case2':
587    echo 'case2';
588    break;
589}
590
591switch ('$switchWithMiddleDefault') {
592case 'case1':
593    echo 'case1';
594    break;
595
596default:
597    echo 'default';
598    break;
599
600case 'case2':
601    echo 'case2';
602    break;
603}
604
605switch ('$switchWithInitialDefault') {
606default:
607    echo 'default';
608    break;
609
610case 'case1':
611    echo 'case1';
612    break;
613
614case 'case2':
615    echo 'case2';
616    break;
617}
618
619switch ('emptySwitch()') {
620}
621
622switch ('defaultSwitch()') {
623default:
624}
625
626declare (ticks=1) {
627    echo 1;
628}
629
630$a = true;
631
632while ($a) {
633    declare (ticks=1) {
634        echo 2;
635    }
636
637    $a = false;
638}
639
640require 'require.php';
641require_once 'require_once.php';
642include 'include.php';
643include_once 'include_once.php';
644echo __FILE__;
645echo __LINE__;
646#if PHP_VERSION >= 530
647echo 'goto a';
648goto a;
649
650$i = 1;
651
652for (; $i <= 2; ++$i) {
653    goto a;
654}
655
656a:
657echo 'label a';
658echo preg_replace_callback('~-([a-z])~', function($match) {
659    return strtoupper($match[1]);
660}, 'hello-world');
661$greet = function($name) {
662    printf('Hello %s' . "\r\n" . '', $name);
663};
664$greet('World');
665$greet('PHP');
666$total = 0;
667$tax = 1;
668$callback = function($quantity, $product) use($tax, &$total) {
669    $tax = 'tax';
670    static $static1 = array(1);
671    static $static2;
672    $tax = 'tax';
673    $tax = --$tax;
674    $pricePerItem = constant('PRICE_' . strtoupper($product));
675    $total += $pricePerItem * $quantity * ($tax + 1);
676};
677#endif
678exit();
679
680?>
Note: See TracBrowser for help on using the repository browser.