First commit

This commit is contained in:
Theodotos Andreou 2018-01-14 13:10:16 +00:00
commit c6e2478c40
13918 changed files with 2303184 additions and 0 deletions

View file

@ -0,0 +1,112 @@
Blockless statements for if/for/etc
-----
<?php
if ($a) $A;
elseif ($b) $B;
else $C;
for (;;) $foo;
foreach ($a as $b) $AB;
while ($a) $A;
do $A; while ($a);
declare (a='b') $C;
-----
array(
0: Stmt_If(
cond: Expr_Variable(
name: a
)
stmts: array(
0: Expr_Variable(
name: A
)
)
elseifs: array(
0: Stmt_ElseIf(
cond: Expr_Variable(
name: b
)
stmts: array(
0: Expr_Variable(
name: B
)
)
)
)
else: Stmt_Else(
stmts: array(
0: Expr_Variable(
name: C
)
)
)
)
1: Stmt_For(
init: array(
)
cond: array(
)
loop: array(
)
stmts: array(
0: Expr_Variable(
name: foo
)
)
)
2: Stmt_Foreach(
expr: Expr_Variable(
name: a
)
keyVar: null
byRef: false
valueVar: Expr_Variable(
name: b
)
stmts: array(
0: Expr_Variable(
name: AB
)
)
)
3: Stmt_While(
cond: Expr_Variable(
name: a
)
stmts: array(
0: Expr_Variable(
name: A
)
)
)
4: Stmt_Do(
cond: Expr_Variable(
name: a
)
stmts: array(
0: Expr_Variable(
name: A
)
)
)
5: Stmt_Declare(
declares: array(
0: Stmt_DeclareDeclare(
key: a
value: Scalar_String(
value: b
)
)
)
stmts: array(
0: Expr_Variable(
name: C
)
)
)
)

View file

@ -0,0 +1,39 @@
Abstract class
-----
<?php
abstract class A {
public function a() {}
abstract public function b();
}
-----
array(
0: Stmt_Class(
flags: MODIFIER_ABSTRACT (16)
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC (1)
byRef: false
name: a
params: array(
)
returnType: null
stmts: array(
)
)
1: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC | MODIFIER_ABSTRACT (17)
byRef: false
name: b
params: array(
)
returnType: null
stmts: null
)
)
)
)

View file

@ -0,0 +1,195 @@
Anonymous classes
-----
<?php
new class {
public function test() {}
};
new class extends A implements B, C {};
new class() {
public $foo;
};
new class($a, $b) extends A {
use T;
};
class A {
public function test() {
return new class($this) extends A {
const A = 'B';
};
}
}
-----
array(
0: Expr_New(
class: Stmt_Class(
flags: 0
name: null
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC (1)
byRef: false
name: test
params: array(
)
returnType: null
stmts: array(
)
)
)
)
args: array(
)
)
1: Expr_New(
class: Stmt_Class(
flags: 0
name: null
extends: Name(
parts: array(
0: A
)
)
implements: array(
0: Name(
parts: array(
0: B
)
)
1: Name(
parts: array(
0: C
)
)
)
stmts: array(
)
)
args: array(
)
)
2: Expr_New(
class: Stmt_Class(
flags: 0
name: null
extends: null
implements: array(
)
stmts: array(
0: Stmt_Property(
flags: MODIFIER_PUBLIC (1)
props: array(
0: Stmt_PropertyProperty(
name: foo
default: null
)
)
)
)
)
args: array(
)
)
3: Expr_New(
class: Stmt_Class(
flags: 0
name: null
extends: Name(
parts: array(
0: A
)
)
implements: array(
)
stmts: array(
0: Stmt_TraitUse(
traits: array(
0: Name(
parts: array(
0: T
)
)
)
adaptations: array(
)
)
)
)
args: array(
0: Arg(
value: Expr_Variable(
name: a
)
byRef: false
unpack: false
)
1: Arg(
value: Expr_Variable(
name: b
)
byRef: false
unpack: false
)
)
)
4: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC (1)
byRef: false
name: test
params: array(
)
returnType: null
stmts: array(
0: Stmt_Return(
expr: Expr_New(
class: Stmt_Class(
flags: 0
name: null
extends: Name(
parts: array(
0: A
)
)
implements: array(
)
stmts: array(
0: Stmt_ClassConst(
flags: 0
consts: array(
0: Const(
name: A
value: Scalar_String(
value: B
)
)
)
)
)
)
args: array(
0: Arg(
value: Expr_Variable(
name: this
)
byRef: false
unpack: false
)
)
)
)
)
)
)
)
)

View file

@ -0,0 +1,33 @@
Conditional class definition
-----
<?php
if (true) {
class A {}
}
-----
array(
0: Stmt_If(
cond: Expr_ConstFetch(
name: Name(
parts: array(
0: true
)
)
)
stmts: array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
)
)
)
elseifs: array(
)
else: null
)
)

View file

@ -0,0 +1,121 @@
Invalid class constant modifiers
-----
<?php
class A {
static const X = 1;
}
-----
!!php7
Cannot use 'static' as constant modifier from 3:5 to 3:10
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassConst(
flags: MODIFIER_STATIC (8)
consts: array(
0: Const(
name: X
value: Scalar_LNumber(
value: 1
)
)
)
)
)
)
)
-----
<?php
class A {
abstract const X = 1;
}
-----
!!php7
Cannot use 'abstract' as constant modifier from 3:5 to 3:12
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassConst(
flags: MODIFIER_ABSTRACT (16)
consts: array(
0: Const(
name: X
value: Scalar_LNumber(
value: 1
)
)
)
)
)
)
)
-----
<?php
class A {
final const X = 1;
}
-----
!!php7
Cannot use 'final' as constant modifier from 3:5 to 3:9
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassConst(
flags: MODIFIER_FINAL (32)
consts: array(
0: Const(
name: X
value: Scalar_LNumber(
value: 1
)
)
)
)
)
)
)
-----
<?php
class A {
public public const X = 1;
}
-----
!!php7
Multiple access type modifiers are not allowed from 3:12 to 3:17
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassConst(
flags: MODIFIER_PUBLIC (1)
consts: array(
0: Const(
name: X
value: Scalar_LNumber(
value: 1
)
)
)
)
)
)
)

View file

@ -0,0 +1,67 @@
Class constant modifiers
-----
<?php
class Foo {
const A = 1;
public const B = 2;
protected const C = 3;
private const D = 4;
}
-----
!!php7
array(
0: Stmt_Class(
flags: 0
name: Foo
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassConst(
flags: 0
consts: array(
0: Const(
name: A
value: Scalar_LNumber(
value: 1
)
)
)
)
1: Stmt_ClassConst(
flags: MODIFIER_PUBLIC (1)
consts: array(
0: Const(
name: B
value: Scalar_LNumber(
value: 2
)
)
)
)
2: Stmt_ClassConst(
flags: MODIFIER_PROTECTED (2)
consts: array(
0: Const(
name: C
value: Scalar_LNumber(
value: 3
)
)
)
)
3: Stmt_ClassConst(
flags: MODIFIER_PRIVATE (4)
consts: array(
0: Const(
name: D
value: Scalar_LNumber(
value: 4
)
)
)
)
)
)
)

View file

@ -0,0 +1,17 @@
Final class
-----
<?php
final class A {}
-----
array(
0: Stmt_Class(
flags: MODIFIER_FINAL (32)
name: A
extends: null
implements: array(
)
stmts: array(
)
)
)

View file

@ -0,0 +1,92 @@
Implicitly public properties and methods
-----
<?php
abstract class A {
var $a;
static $b;
abstract function c();
final function d() {}
static function e() {}
final static function f() {}
function g() {}
}
-----
array(
0: Stmt_Class(
flags: MODIFIER_ABSTRACT (16)
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_Property(
flags: 0
props: array(
0: Stmt_PropertyProperty(
name: a
default: null
)
)
)
1: Stmt_Property(
flags: MODIFIER_STATIC (8)
props: array(
0: Stmt_PropertyProperty(
name: b
default: null
)
)
)
2: Stmt_ClassMethod(
flags: MODIFIER_ABSTRACT (16)
byRef: false
name: c
params: array(
)
returnType: null
stmts: null
)
3: Stmt_ClassMethod(
flags: MODIFIER_FINAL (32)
byRef: false
name: d
params: array(
)
returnType: null
stmts: array(
)
)
4: Stmt_ClassMethod(
flags: MODIFIER_STATIC (8)
byRef: false
name: e
params: array(
)
returnType: null
stmts: array(
)
)
5: Stmt_ClassMethod(
flags: MODIFIER_STATIC | MODIFIER_FINAL (40)
byRef: false
name: f
params: array(
)
returnType: null
stmts: array(
)
)
6: Stmt_ClassMethod(
flags: 0
byRef: false
name: g
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)

View file

@ -0,0 +1,36 @@
Interface
-----
<?php
interface A extends C, D {
public function a();
}
-----
array(
0: Stmt_Interface(
name: A
extends: array(
0: Name(
parts: array(
0: C
)
)
1: Name(
parts: array(
0: D
)
)
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC (1)
byRef: false
name: a
params: array(
)
returnType: null
stmts: null
)
)
)
)

View file

@ -0,0 +1,215 @@
Invalid modifier combination
-----
<?php class A { public public $a; }
-----
Multiple access type modifiers are not allowed from 1:24 to 1:29
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_Property(
flags: MODIFIER_PUBLIC (1)
props: array(
0: Stmt_PropertyProperty(
name: a
default: null
)
)
)
)
)
)
-----
<?php class A { public protected $a; }
-----
Multiple access type modifiers are not allowed from 1:24 to 1:32
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_Property(
flags: MODIFIER_PUBLIC | MODIFIER_PROTECTED (3)
props: array(
0: Stmt_PropertyProperty(
name: a
default: null
)
)
)
)
)
)
-----
<?php class A { abstract abstract function a(); }
-----
Multiple abstract modifiers are not allowed from 1:26 to 1:33
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_ABSTRACT (16)
byRef: false
name: a
params: array(
)
returnType: null
stmts: null
)
)
)
)
-----
<?php class A { static static $a; }
-----
Multiple static modifiers are not allowed from 1:24 to 1:29
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_Property(
flags: MODIFIER_STATIC (8)
props: array(
0: Stmt_PropertyProperty(
name: a
default: null
)
)
)
)
)
)
-----
<?php class A { final final function a() {} }
-----
Multiple final modifiers are not allowed from 1:23 to 1:27
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_FINAL (32)
byRef: false
name: a
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)
-----
<?php class A { abstract final function a(); }
-----
Cannot use the final modifier on an abstract class member from 1:26 to 1:30
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_ABSTRACT | MODIFIER_FINAL (48)
byRef: false
name: a
params: array(
)
returnType: null
stmts: null
)
)
)
)
-----
<?php abstract final class A { }
// Type in the partial parse could conceivably be any of 0, 16 or 32
-----
Syntax error, unexpected T_FINAL, expecting T_CLASS from 1:16 to 1:20
array(
0: Stmt_Class(
flags: MODIFIER_FINAL (32)
name: A
extends: null
implements: array(
)
stmts: array(
)
)
1: Stmt_Nop(
comments: array(
0: // Type in the partial parse could conceivably be any of 0, 16 or 32
)
)
)
-----
<?php class A { abstract $a; }
-----
Properties cannot be declared abstract from 1:17 to 1:24
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_Property(
flags: MODIFIER_ABSTRACT (16)
props: array(
0: Stmt_PropertyProperty(
name: a
default: null
)
)
)
)
)
)
-----
<?php class A { final $a; }
-----
Properties cannot be declared final from 1:17 to 1:21
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_Property(
flags: MODIFIER_FINAL (32)
props: array(
0: Stmt_PropertyProperty(
name: a
default: null
)
)
)
)
)
)

View file

@ -0,0 +1,240 @@
Invalid class name
-----
<?php class self {}
-----
Cannot use 'self' as class name as it is reserved from 1:13 to 1:16
array(
0: Stmt_Class(
flags: 0
name: self
extends: null
implements: array(
)
stmts: array(
)
)
)
-----
<?php class PARENT {}
-----
Cannot use 'PARENT' as class name as it is reserved from 1:13 to 1:18
array(
0: Stmt_Class(
flags: 0
name: PARENT
extends: null
implements: array(
)
stmts: array(
)
)
)
-----
<?php class static {}
-----
Syntax error, unexpected T_STATIC, expecting T_STRING from 1:13 to 1:18
array(
)
-----
<?php class A extends self {}
-----
Cannot use 'self' as class name as it is reserved from 1:23 to 1:26
array(
0: Stmt_Class(
flags: 0
name: A
extends: Name(
parts: array(
0: self
)
)
implements: array(
)
stmts: array(
)
)
)
-----
<?php class A extends PARENT {}
-----
Cannot use 'PARENT' as class name as it is reserved from 1:23 to 1:28
array(
0: Stmt_Class(
flags: 0
name: A
extends: Name(
parts: array(
0: PARENT
)
)
implements: array(
)
stmts: array(
)
)
)
-----
<?php class A extends static {}
-----
Cannot use 'static' as class name as it is reserved from 1:23 to 1:28
array(
0: Stmt_Class(
flags: 0
name: A
extends: Name(
parts: array(
0: static
)
)
implements: array(
)
stmts: array(
)
)
)
-----
<?php class A implements self {}
-----
Cannot use 'self' as interface name as it is reserved from 1:26 to 1:29
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
0: Name(
parts: array(
0: self
)
)
)
stmts: array(
)
)
)
-----
<?php class A implements PARENT {}
-----
Cannot use 'PARENT' as interface name as it is reserved from 1:26 to 1:31
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
0: Name(
parts: array(
0: PARENT
)
)
)
stmts: array(
)
)
)
-----
<?php class A implements static {}
-----
Cannot use 'static' as interface name as it is reserved from 1:26 to 1:31
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
0: Name(
parts: array(
0: static
)
)
)
stmts: array(
)
)
)
-----
<?php interface self {}
-----
Cannot use 'self' as class name as it is reserved from 1:17 to 1:20
array(
0: Stmt_Interface(
name: self
extends: array(
)
stmts: array(
)
)
)
-----
<?php interface PARENT {}
-----
Cannot use 'PARENT' as class name as it is reserved from 1:17 to 1:22
array(
0: Stmt_Interface(
name: PARENT
extends: array(
)
stmts: array(
)
)
)
-----
<?php interface static {}
-----
Syntax error, unexpected T_STATIC, expecting T_STRING from 1:17 to 1:22
array(
)
-----
<?php interface A extends self {}
-----
Cannot use 'self' as interface name as it is reserved from 1:27 to 1:30
array(
0: Stmt_Interface(
name: A
extends: array(
0: Name(
parts: array(
0: self
)
)
)
stmts: array(
)
)
)
-----
<?php interface A extends PARENT {}
-----
Cannot use 'PARENT' as interface name as it is reserved from 1:27 to 1:32
array(
0: Stmt_Interface(
name: A
extends: array(
0: Name(
parts: array(
0: PARENT
)
)
)
stmts: array(
)
)
)
-----
<?php interface A extends static {}
-----
Cannot use 'static' as interface name as it is reserved from 1:27 to 1:32
array(
0: Stmt_Interface(
name: A
extends: array(
0: Name(
parts: array(
0: static
)
)
)
stmts: array(
)
)
)

View file

@ -0,0 +1,50 @@
PHP 4 style declarations
-----
<?php
class A {
var $foo;
function bar() {}
static abstract function baz() {}
}
-----
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_Property(
flags: 0
props: array(
0: Stmt_PropertyProperty(
name: foo
default: null
)
)
)
1: Stmt_ClassMethod(
flags: 0
byRef: false
name: bar
params: array(
)
returnType: null
stmts: array(
)
)
2: Stmt_ClassMethod(
flags: MODIFIER_ABSTRACT | MODIFIER_STATIC (24)
byRef: false
name: baz
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)

View file

@ -0,0 +1,156 @@
Class declaration
-----
<?php
class A extends B implements C, D {
const A = 'B', C = 'D';
public $a = 'b', $c = 'd';
protected $e;
private $f;
public function a() {}
public static function b($a) {}
public final function c() : B {}
protected function d() {}
private function e() {}
}
-----
array(
0: Stmt_Class(
flags: 0
name: A
extends: Name(
parts: array(
0: B
)
)
implements: array(
0: Name(
parts: array(
0: C
)
)
1: Name(
parts: array(
0: D
)
)
)
stmts: array(
0: Stmt_ClassConst(
flags: 0
consts: array(
0: Const(
name: A
value: Scalar_String(
value: B
)
)
1: Const(
name: C
value: Scalar_String(
value: D
)
)
)
)
1: Stmt_Property(
flags: MODIFIER_PUBLIC (1)
props: array(
0: Stmt_PropertyProperty(
name: a
default: Scalar_String(
value: b
)
)
1: Stmt_PropertyProperty(
name: c
default: Scalar_String(
value: d
)
)
)
)
2: Stmt_Property(
flags: MODIFIER_PROTECTED (2)
props: array(
0: Stmt_PropertyProperty(
name: e
default: null
)
)
)
3: Stmt_Property(
flags: MODIFIER_PRIVATE (4)
props: array(
0: Stmt_PropertyProperty(
name: f
default: null
)
)
)
4: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC (1)
byRef: false
name: a
params: array(
)
returnType: null
stmts: array(
)
)
5: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC | MODIFIER_STATIC (9)
byRef: false
name: b
params: array(
0: Param(
type: null
byRef: false
variadic: false
name: a
default: null
)
)
returnType: null
stmts: array(
)
)
6: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC | MODIFIER_FINAL (33)
byRef: false
name: c
params: array(
)
returnType: Name(
parts: array(
0: B
)
)
stmts: array(
)
)
7: Stmt_ClassMethod(
flags: MODIFIER_PROTECTED (2)
byRef: false
name: d
params: array(
)
returnType: null
stmts: array(
)
)
8: Stmt_ClassMethod(
flags: MODIFIER_PRIVATE (4)
byRef: false
name: e
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)

View file

@ -0,0 +1,151 @@
Some special methods cannot be static
-----
<?php class A { static function __construct() {} }
-----
Constructor __construct() cannot be static from 1:17 to 1:22
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_STATIC (8)
byRef: false
name: __construct
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)
-----
<?php class A { static function __destruct() {} }
-----
Destructor __destruct() cannot be static from 1:17 to 1:22
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_STATIC (8)
byRef: false
name: __destruct
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)
-----
<?php class A { static function __clone() {} }
-----
Clone method __clone() cannot be static from 1:17 to 1:22
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_STATIC (8)
byRef: false
name: __clone
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)
-----
<?php class A { static function __CONSTRUCT() {} }
-----
Constructor __CONSTRUCT() cannot be static from 1:17 to 1:22
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_STATIC (8)
byRef: false
name: __CONSTRUCT
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)
-----
<?php class A { static function __Destruct() {} }
-----
Destructor __Destruct() cannot be static from 1:17 to 1:22
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_STATIC (8)
byRef: false
name: __Destruct
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)
-----
<?php class A { static function __cLoNe() {} }
-----
Clone method __cLoNe() cannot be static from 1:17 to 1:22
array(
0: Stmt_Class(
flags: 0
name: A
extends: null
implements: array(
)
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_STATIC (8)
byRef: false
name: __cLoNe
params: array(
)
returnType: null
stmts: array(
)
)
)
)
)

View file

@ -0,0 +1,160 @@
Traits
-----
<?php
trait A {
public function a() {}
}
class B {
use C;
use D {
a as protected b;
c as d;
e as private;
}
use E, F, G {
E::a insteadof F, G;
E::b as protected c;
E::d as e;
E::f as private;
}
}
-----
array(
0: Stmt_Trait(
name: A
stmts: array(
0: Stmt_ClassMethod(
flags: MODIFIER_PUBLIC (1)
byRef: false
name: a
params: array(
)
returnType: null
stmts: array(
)
)
)
)
1: Stmt_Class(
flags: 0
name: B
extends: null
implements: array(
)
stmts: array(
0: Stmt_TraitUse(
traits: array(
0: Name(
parts: array(
0: C
)
)
)
adaptations: array(
)
)
1: Stmt_TraitUse(
traits: array(
0: Name(
parts: array(
0: D
)
)
)
adaptations: array(
0: Stmt_TraitUseAdaptation_Alias(
trait: null
method: a
newModifier: MODIFIER_PROTECTED (2)
newName: b
)
1: Stmt_TraitUseAdaptation_Alias(
trait: null
method: c
newModifier: null
newName: d
)
2: Stmt_TraitUseAdaptation_Alias(
trait: null
method: e
newModifier: MODIFIER_PRIVATE (4)
newName: null
)
)
)
2: Stmt_TraitUse(
traits: array(
0: Name(
parts: array(
0: E
)
)
1: Name(
parts: array(
0: F
)
)
2: Name(
parts: array(
0: G
)
)
)
adaptations: array(
0: Stmt_TraitUseAdaptation_Precedence(
trait: Name(
parts: array(
0: E
)
)
method: a
insteadof: array(
0: Name(
parts: array(
0: F
)
)
1: Name(
parts: array(
0: G
)
)
)
)
1: Stmt_TraitUseAdaptation_Alias(
trait: Name(
parts: array(
0: E
)
)
method: b
newModifier: MODIFIER_PROTECTED (2)
newName: c
)
2: Stmt_TraitUseAdaptation_Alias(
trait: Name(
parts: array(
0: E
)
)
method: d
newModifier: null
newName: e
)
3: Stmt_TraitUseAdaptation_Alias(
trait: Name(
parts: array(
0: E
)
)
method: f
newModifier: MODIFIER_PRIVATE (4)
newName: null
)
)
)
)
)
)

View file

@ -0,0 +1,40 @@
Global constants
-----
<?php
const A = 0, B = 1.0, C = 'A', D = E;
-----
array(
0: Stmt_Const(
consts: array(
0: Const(
name: A
value: Scalar_LNumber(
value: 0
)
)
1: Const(
name: B
value: Scalar_DNumber(
value: 1
)
)
2: Const(
name: C
value: Scalar_String(
value: A
)
)
3: Const(
name: D
value: Expr_ConstFetch(
name: Name(
parts: array(
0: E
)
)
)
)
)
)
)

View file

@ -0,0 +1,55 @@
Control flow statements
-----
<?php
break;
break 2;
continue;
continue 2;
return;
return $a;
throw $e;
label:
goto label;
-----
array(
0: Stmt_Break(
num: null
)
1: Stmt_Break(
num: Scalar_LNumber(
value: 2
)
)
2: Stmt_Continue(
num: null
)
3: Stmt_Continue(
num: Scalar_LNumber(
value: 2
)
)
4: Stmt_Return(
expr: null
)
5: Stmt_Return(
expr: Expr_Variable(
name: a
)
)
6: Stmt_Throw(
expr: Expr_Variable(
name: e
)
)
7: Stmt_Label(
name: label
)
8: Stmt_Goto(
name: label
)
)

View file

@ -0,0 +1,60 @@
Declare
-----
<?php
declare (X='Y');
declare (A='B', C='D') {}
declare (A='B', C='D'):
enddeclare;
-----
array(
0: Stmt_Declare(
declares: array(
0: Stmt_DeclareDeclare(
key: X
value: Scalar_String(
value: Y
)
)
)
stmts: null
)
1: Stmt_Declare(
declares: array(
0: Stmt_DeclareDeclare(
key: A
value: Scalar_String(
value: B
)
)
1: Stmt_DeclareDeclare(
key: C
value: Scalar_String(
value: D
)
)
)
stmts: array(
)
)
2: Stmt_Declare(
declares: array(
0: Stmt_DeclareDeclare(
key: A
value: Scalar_String(
value: B
)
)
1: Stmt_DeclareDeclare(
key: C
value: Scalar_String(
value: D
)
)
)
stmts: array(
)
)
)

View file

@ -0,0 +1,32 @@
Echo
-----
<?php
echo 'Hallo World!';
echo 'Hallo', ' ', 'World', '!';
-----
array(
0: Stmt_Echo(
exprs: array(
0: Scalar_String(
value: Hallo World!
)
)
)
1: Stmt_Echo(
exprs: array(
0: Scalar_String(
value: Hallo
)
1: Scalar_String(
value:
)
2: Scalar_String(
value: World
)
3: Scalar_String(
value: !
)
)
)
)

View file

@ -0,0 +1,59 @@
Scalar type declarations
-----
<?php
function test(bool $a, Int $b, FLOAT $c, StRiNg $d, iterable $e, object $f) : void {}
-----
!!php7
array(
0: Stmt_Function(
byRef: false
name: test
params: array(
0: Param(
type: bool
byRef: false
variadic: false
name: a
default: null
)
1: Param(
type: int
byRef: false
variadic: false
name: b
default: null
)
2: Param(
type: float
byRef: false
variadic: false
name: c
default: null
)
3: Param(
type: string
byRef: false
variadic: false
name: d
default: null
)
4: Param(
type: iterable
byRef: false
variadic: false
name: e
default: null
)
5: Param(
type: object
byRef: false
variadic: false
name: f
default: null
)
)
returnType: void
stmts: array(
)
)
)

View file

@ -0,0 +1,41 @@
Return and pass by ref
-----
<?php
function a(&$b) {}
function &a($b) {}
-----
array(
0: Stmt_Function(
byRef: false
name: a
params: array(
0: Param(
type: null
byRef: true
variadic: false
name: b
default: null
)
)
returnType: null
stmts: array(
)
)
1: Stmt_Function(
byRef: true
name: a
params: array(
0: Param(
type: null
byRef: false
variadic: false
name: b
default: null
)
)
returnType: null
stmts: array(
)
)
)

View file

@ -0,0 +1,33 @@
Conditional function definition
-----
<?php
if (true) {
function A() {}
}
-----
array(
0: Stmt_If(
cond: Expr_ConstFetch(
name: Name(
parts: array(
0: true
)
)
)
stmts: array(
0: Stmt_Function(
byRef: false
name: A
params: array(
)
returnType: null
stmts: array(
)
)
)
elseifs: array(
)
else: null
)
)

View file

@ -0,0 +1,148 @@
Default values (static scalar tests)
-----
<?php
function a(
$b = null,
$c = 'foo',
$d = A::B,
$f = +1,
$g = -1.0,
$h = array(),
$i = [],
$j = ['foo'],
$k = ['foo', 'bar' => 'baz']
) {}
-----
array(
0: Stmt_Function(
byRef: false
name: a
params: array(
0: Param(
type: null
byRef: false
variadic: false
name: b
default: Expr_ConstFetch(
name: Name(
parts: array(
0: null
)
)
)
)
1: Param(
type: null
byRef: false
variadic: false
name: c
default: Scalar_String(
value: foo
)
)
2: Param(
type: null
byRef: false
variadic: false
name: d
default: Expr_ClassConstFetch(
class: Name(
parts: array(
0: A
)
)
name: B
)
)
3: Param(
type: null
byRef: false
variadic: false
name: f
default: Expr_UnaryPlus(
expr: Scalar_LNumber(
value: 1
)
)
)
4: Param(
type: null
byRef: false
variadic: false
name: g
default: Expr_UnaryMinus(
expr: Scalar_DNumber(
value: 1
)
)
)
5: Param(
type: null
byRef: false
variadic: false
name: h
default: Expr_Array(
items: array(
)
)
)
6: Param(
type: null
byRef: false
variadic: false
name: i
default: Expr_Array(
items: array(
)
)
)
7: Param(
type: null
byRef: false
variadic: false
name: j
default: Expr_Array(
items: array(
0: Expr_ArrayItem(
key: null
value: Scalar_String(
value: foo
)
byRef: false
)
)
)
)
8: Param(
type: null
byRef: false
variadic: false
name: k
default: Expr_Array(
items: array(
0: Expr_ArrayItem(
key: null
value: Scalar_String(
value: foo
)
byRef: false
)
1: Expr_ArrayItem(
key: Scalar_String(
value: bar
)
value: Scalar_String(
value: baz
)
byRef: false
)
)
)
)
)
returnType: null
stmts: array(
)
)
)

View file

@ -0,0 +1,47 @@
Nullable types
-----
<?php
function test(?Foo $bar, ?string $foo) : ?Baz {
}
-----
!!php7
array(
0: Stmt_Function(
byRef: false
name: test
params: array(
0: Param(
type: NullableType(
type: Name(
parts: array(
0: Foo
)
)
)
byRef: false
variadic: false
name: bar
default: null
)
1: Param(
type: NullableType(
type: string
)
byRef: false
variadic: false
name: foo
default: null
)
)
returnType: NullableType(
type: Name(
parts: array(
0: Baz
)
)
)
stmts: array(
)
)
)

View file

@ -0,0 +1,52 @@
Return type declarations
-----
<?php
function test1() {}
function test2() : array {}
function test3() : callable {}
function test4() : Foo\Bar {}
-----
array(
0: Stmt_Function(
byRef: false
name: test1
params: array(
)
returnType: null
stmts: array(
)
)
1: Stmt_Function(
byRef: false
name: test2
params: array(
)
returnType: array
stmts: array(
)
)
2: Stmt_Function(
byRef: false
name: test3
params: array(
)
returnType: callable
stmts: array(
)
)
3: Stmt_Function(
byRef: false
name: test4
params: array(
)
returnType: Name(
parts: array(
0: Foo
1: Bar
)
)
stmts: array(
)
)
)

View file

@ -0,0 +1,51 @@
Special function variables
-----
<?php
function a() {
global $a, ${'b'}, $$c;
static $c, $d = 'e';
}
-----
array(
0: Stmt_Function(
byRef: false
name: a
params: array(
)
returnType: null
stmts: array(
0: Stmt_Global(
vars: array(
0: Expr_Variable(
name: a
)
1: Expr_Variable(
name: Scalar_String(
value: b
)
)
2: Expr_Variable(
name: Expr_Variable(
name: c
)
)
)
)
1: Stmt_Static(
vars: array(
0: Stmt_StaticVar(
name: c
default: null
)
1: Stmt_StaticVar(
name: d
default: Scalar_String(
value: e
)
)
)
)
)
)
)

View file

@ -0,0 +1,49 @@
Type hints
-----
<?php
function a($b, array $c, callable $d, E $f) {}
-----
array(
0: Stmt_Function(
byRef: false
name: a
params: array(
0: Param(
type: null
byRef: false
variadic: false
name: b
default: null
)
1: Param(
type: array
byRef: false
variadic: false
name: c
default: null
)
2: Param(
type: callable
byRef: false
variadic: false
name: d
default: null
)
3: Param(
type: Name(
parts: array(
0: E
)
)
byRef: false
variadic: false
name: f
default: null
)
)
returnType: null
stmts: array(
)
)
)

View file

@ -0,0 +1,110 @@
Variadic functions
-----
<?php
function test($a, ... $b) {}
function test($a, &... $b) {}
function test($a, Type ... $b) {}
function test($a, Type &... $b) {}
-----
array(
0: Stmt_Function(
byRef: false
name: test
params: array(
0: Param(
type: null
byRef: false
variadic: false
name: a
default: null
)
1: Param(
type: null
byRef: false
variadic: true
name: b
default: null
)
)
returnType: null
stmts: array(
)
)
1: Stmt_Function(
byRef: false
name: test
params: array(
0: Param(
type: null
byRef: false
variadic: false
name: a
default: null
)
1: Param(
type: null
byRef: true
variadic: true
name: b
default: null
)
)
returnType: null
stmts: array(
)
)
2: Stmt_Function(
byRef: false
name: test
params: array(
0: Param(
type: null
byRef: false
variadic: false
name: a
default: null
)
1: Param(
type: Name(
parts: array(
0: Type
)
)
byRef: false
variadic: true
name: b
default: null
)
)
returnType: null
stmts: array(
)
)
3: Stmt_Function(
byRef: false
name: test
params: array(
0: Param(
type: null
byRef: false
variadic: false
name: a
default: null
)
1: Param(
type: Name(
parts: array(
0: Type
)
)
byRef: true
variadic: true
name: b
default: null
)
)
returnType: null
stmts: array(
)
)
)

View file

@ -0,0 +1,27 @@
Invalid variadic function
-----
<?php
function foo(...$foo = []) {}
-----
Variadic parameter cannot have a default value from 2:24 to 2:25
array(
0: Stmt_Function(
byRef: false
name: foo
params: array(
0: Param(
type: null
byRef: false
variadic: true
name: foo
default: Expr_Array(
items: array(
)
)
)
)
returnType: null
stmts: array(
)
)
)

View file

@ -0,0 +1,280 @@
Generators (yield expression)
-----
<?php
function gen() {
// statements
yield;
yield $value;
yield $key => $value;
// expressions
$data = yield;
$data = (yield $value);
$data = (yield $key => $value);
// yield in language constructs with their own parentheses
if (yield $foo); elseif (yield $foo);
if (yield $foo): elseif (yield $foo): endif;
while (yield $foo);
do {} while (yield $foo);
switch (yield $foo) {}
die(yield $foo);
// yield in function calls
func(yield $foo);
$foo->func(yield $foo);
new Foo(yield $foo);
yield from $foo;
yield from $foo and yield from $bar;
yield from $foo + $bar;
}
-----
array(
0: Stmt_Function(
byRef: false
name: gen
params: array(
)
returnType: null
stmts: array(
0: Expr_Yield(
key: null
value: null
comments: array(
0: // statements
)
)
1: Expr_Yield(
key: null
value: Expr_Variable(
name: value
)
)
2: Expr_Yield(
key: Expr_Variable(
name: key
)
value: Expr_Variable(
name: value
)
)
3: Expr_Assign(
var: Expr_Variable(
name: data
comments: array(
0: // expressions
)
)
expr: Expr_Yield(
key: null
value: null
)
comments: array(
0: // expressions
)
)
4: Expr_Assign(
var: Expr_Variable(
name: data
)
expr: Expr_Yield(
key: null
value: Expr_Variable(
name: value
)
)
)
5: Expr_Assign(
var: Expr_Variable(
name: data
)
expr: Expr_Yield(
key: Expr_Variable(
name: key
)
value: Expr_Variable(
name: value
)
)
)
6: Stmt_If(
cond: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
stmts: array(
)
elseifs: array(
0: Stmt_ElseIf(
cond: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
stmts: array(
)
)
)
else: null
comments: array(
0: // yield in language constructs with their own parentheses
)
)
7: Stmt_If(
cond: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
stmts: array(
)
elseifs: array(
0: Stmt_ElseIf(
cond: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
stmts: array(
)
)
)
else: null
)
8: Stmt_While(
cond: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
stmts: array(
)
)
9: Stmt_Do(
cond: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
stmts: array(
)
)
10: Stmt_Switch(
cond: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
cases: array(
)
)
11: Expr_Exit(
expr: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
)
12: Expr_FuncCall(
name: Name(
parts: array(
0: func
)
comments: array(
0: // yield in function calls
)
)
args: array(
0: Arg(
value: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
byRef: false
unpack: false
)
)
comments: array(
0: // yield in function calls
)
)
13: Expr_MethodCall(
var: Expr_Variable(
name: foo
)
name: func
args: array(
0: Arg(
value: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
byRef: false
unpack: false
)
)
)
14: Expr_New(
class: Name(
parts: array(
0: Foo
)
)
args: array(
0: Arg(
value: Expr_Yield(
key: null
value: Expr_Variable(
name: foo
)
)
byRef: false
unpack: false
)
)
)
15: Expr_YieldFrom(
expr: Expr_Variable(
name: foo
)
)
16: Expr_BinaryOp_LogicalAnd(
left: Expr_YieldFrom(
expr: Expr_Variable(
name: foo
)
)
right: Expr_YieldFrom(
expr: Expr_Variable(
name: bar
)
)
)
17: Expr_YieldFrom(
expr: Expr_BinaryOp_Plus(
left: Expr_Variable(
name: foo
)
right: Expr_Variable(
name: bar
)
)
)
)
)
)

View file

@ -0,0 +1,230 @@
Yield operator precedence
-----
<?php
function gen() {
yield "a" . "b";
yield "a" or die;
yield "k" => "a" . "b";
yield "k" => "a" or die;
var_dump([yield "k" => "a" . "b"]);
yield yield "k1" => yield "k2" => "a" . "b";
yield yield "k1" => (yield "k2") => "a" . "b";
var_dump([yield "k1" => yield "k2" => "a" . "b"]);
var_dump([yield "k1" => (yield "k2") => "a" . "b"]);
}
-----
!!php7
array(
0: Stmt_Function(
byRef: false
name: gen
params: array(
)
returnType: null
stmts: array(
0: Expr_Yield(
key: null
value: Expr_BinaryOp_Concat(
left: Scalar_String(
value: a
)
right: Scalar_String(
value: b
)
)
)
1: Expr_BinaryOp_LogicalOr(
left: Expr_Yield(
key: null
value: Scalar_String(
value: a
)
)
right: Expr_Exit(
expr: null
)
)
2: Expr_Yield(
key: Scalar_String(
value: k
)
value: Expr_BinaryOp_Concat(
left: Scalar_String(
value: a
)
right: Scalar_String(
value: b
)
)
)
3: Expr_BinaryOp_LogicalOr(
left: Expr_Yield(
key: Scalar_String(
value: k
)
value: Scalar_String(
value: a
)
)
right: Expr_Exit(
expr: null
)
)
4: Expr_FuncCall(
name: Name(
parts: array(
0: var_dump
)
)
args: array(
0: Arg(
value: Expr_Array(
items: array(
0: Expr_ArrayItem(
key: null
value: Expr_Yield(
key: Scalar_String(
value: k
)
value: Expr_BinaryOp_Concat(
left: Scalar_String(
value: a
)
right: Scalar_String(
value: b
)
)
)
byRef: false
)
)
)
byRef: false
unpack: false
)
)
)
5: Expr_Yield(
key: null
value: Expr_Yield(
key: Scalar_String(
value: k1
)
value: Expr_Yield(
key: Scalar_String(
value: k2
)
value: Expr_BinaryOp_Concat(
left: Scalar_String(
value: a
)
right: Scalar_String(
value: b
)
)
)
)
)
6: Expr_Yield(
key: Expr_Yield(
key: Scalar_String(
value: k1
)
value: Expr_Yield(
key: null
value: Scalar_String(
value: k2
)
)
)
value: Expr_BinaryOp_Concat(
left: Scalar_String(
value: a
)
right: Scalar_String(
value: b
)
)
)
7: Expr_FuncCall(
name: Name(
parts: array(
0: var_dump
)
)
args: array(
0: Arg(
value: Expr_Array(
items: array(
0: Expr_ArrayItem(
key: null
value: Expr_Yield(
key: Scalar_String(
value: k1
)
value: Expr_Yield(
key: Scalar_String(
value: k2
)
value: Expr_BinaryOp_Concat(
left: Scalar_String(
value: a
)
right: Scalar_String(
value: b
)
)
)
)
byRef: false
)
)
)
byRef: false
unpack: false
)
)
)
8: Expr_FuncCall(
name: Name(
parts: array(
0: var_dump
)
)
args: array(
0: Arg(
value: Expr_Array(
items: array(
0: Expr_ArrayItem(
key: Expr_Yield(
key: Scalar_String(
value: k1
)
value: Expr_Yield(
key: null
value: Scalar_String(
value: k2
)
)
)
value: Expr_BinaryOp_Concat(
left: Scalar_String(
value: a
)
right: Scalar_String(
value: b
)
)
byRef: false
)
)
)
byRef: false
unpack: false
)
)
)
)
)
)

View file

@ -0,0 +1,48 @@
Yield with unary operator argument
-----
<?php
function gen() {
yield +1;
yield -1;
yield * -1;
}
-----
array(
0: Stmt_Function(
byRef: false
name: gen
params: array(
)
returnType: null
stmts: array(
0: Expr_Yield(
key: null
value: Expr_UnaryPlus(
expr: Scalar_LNumber(
value: 1
)
)
)
1: Expr_Yield(
key: null
value: Expr_UnaryMinus(
expr: Scalar_LNumber(
value: 1
)
)
)
2: Expr_BinaryOp_Mul(
left: Expr_Yield(
key: null
value: null
)
right: Expr_UnaryMinus(
expr: Scalar_LNumber(
value: 1
)
)
)
)
)
)

View file

@ -0,0 +1,55 @@
__halt_compiler
-----
<?php
$a;
__halt_compiler()
?>
Hallo World!
-----
array(
0: Expr_Variable(
name: a
)
1: Stmt_HaltCompiler(
remaining: Hallo World!
)
)
-----
<?php
$a;
__halt_compiler();Hallo World!
-----
array(
0: Expr_Variable(
name: a
)
1: Stmt_HaltCompiler(
remaining: Hallo World!
)
)
-----
<?php
namespace A;
$a;
__halt_compiler();
-----
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: A
)
)
stmts: array(
0: Expr_Variable(
name: a
)
)
)
1: Stmt_HaltCompiler(
remaining:
)
)

View file

@ -0,0 +1,6 @@
Invalid __halt_compiler() syntax
-----
<?php
__halt_compiler()
-----
__HALT_COMPILER must be followed by "();" on line 2

View file

@ -0,0 +1,34 @@
Use of __HALT_COMPILER_OFFSET__ constant
-----
<?php
var_dump(__HALT_COMPILER_OFFSET__);
__halt_compiler();
Foo
-----
array(
0: Expr_FuncCall(
name: Name(
parts: array(
0: var_dump
)
)
args: array(
0: Arg(
value: Expr_ConstFetch(
name: Name(
parts: array(
0: __HALT_COMPILER_OFFSET__
)
)
)
byRef: false
unpack: false
)
)
)
1: Stmt_HaltCompiler(
remaining:
Foo
)
)

View file

@ -0,0 +1,8 @@
__halt_compiler can only be used from outermost scope
-----
<?php
if (true) {
__halt_compiler();
}
-----
__HALT_COMPILER() can only be used from the outermost scope from 3:5 to 3:19

View file

@ -0,0 +1,26 @@
Hashbang line
-----
#!/usr/bin/env php
<?php
echo "foobar";
?>
#!/usr/bin/env php
-----
array(
0: Stmt_InlineHTML(
value: #!/usr/bin/env php
)
1: Stmt_Echo(
exprs: array(
0: Scalar_String(
value: foobar
)
)
)
2: Stmt_InlineHTML(
value: #!/usr/bin/env php
)
)

View file

@ -0,0 +1,103 @@
If/Elseif/Else
-----
<?php
if ($a) {}
elseif ($b) {}
elseif ($c) {}
else {}
if ($a) {} // without else
if ($a):
elseif ($b):
elseif ($c):
else :
endif;
if ($a): endif; // without else
-----
array(
0: Stmt_If(
cond: Expr_Variable(
name: a
)
stmts: array(
)
elseifs: array(
0: Stmt_ElseIf(
cond: Expr_Variable(
name: b
)
stmts: array(
)
)
1: Stmt_ElseIf(
cond: Expr_Variable(
name: c
)
stmts: array(
)
)
)
else: Stmt_Else(
stmts: array(
)
)
)
1: Stmt_If(
cond: Expr_Variable(
name: a
)
stmts: array(
)
elseifs: array(
)
else: null
)
2: Stmt_If(
cond: Expr_Variable(
name: a
)
stmts: array(
)
elseifs: array(
0: Stmt_ElseIf(
cond: Expr_Variable(
name: b
)
stmts: array(
)
)
1: Stmt_ElseIf(
cond: Expr_Variable(
name: c
)
stmts: array(
)
)
)
else: Stmt_Else(
stmts: array(
)
)
comments: array(
0: // without else
)
)
3: Stmt_If(
cond: Expr_Variable(
name: a
)
stmts: array(
)
elseifs: array(
)
else: null
)
4: Stmt_Nop(
comments: array(
0: // without else
)
)
)

View file

@ -0,0 +1,27 @@
Inline HTML
-----
<?php
$a;
?>
B
<?php
$c;
?>
<?php
$d;
-----
array(
0: Expr_Variable(
name: a
)
1: Stmt_InlineHTML(
value: B
)
2: Expr_Variable(
name: c
)
3: Expr_Variable(
name: d
)
)

View file

@ -0,0 +1,17 @@
Do loop
-----
<?php
do {
} while ($a);
-----
array(
0: Stmt_Do(
cond: Expr_Variable(
name: a
)
stmts: array(
)
)
)

View file

@ -0,0 +1,110 @@
For loop
-----
<?php
// "classical" loop
for ($i = 0; $i < $c; ++$i) {}
// multiple expressions
for ($a, $b; $c, $d; $e, $f) {}
// infinite loop
for (;;) {}
// alternative syntax
for (;;):
endfor;
-----
array(
0: Stmt_For(
init: array(
0: Expr_Assign(
var: Expr_Variable(
name: i
)
expr: Scalar_LNumber(
value: 0
)
)
)
cond: array(
0: Expr_BinaryOp_Smaller(
left: Expr_Variable(
name: i
)
right: Expr_Variable(
name: c
)
)
)
loop: array(
0: Expr_PreInc(
var: Expr_Variable(
name: i
)
)
)
stmts: array(
)
comments: array(
0: // "classical" loop
)
)
1: Stmt_For(
init: array(
0: Expr_Variable(
name: a
)
1: Expr_Variable(
name: b
)
)
cond: array(
0: Expr_Variable(
name: c
)
1: Expr_Variable(
name: d
)
)
loop: array(
0: Expr_Variable(
name: e
)
1: Expr_Variable(
name: f
)
)
stmts: array(
)
comments: array(
0: // multiple expressions
)
)
2: Stmt_For(
init: array(
)
cond: array(
)
loop: array(
)
stmts: array(
)
comments: array(
0: // infinite loop
)
)
3: Stmt_For(
init: array(
)
cond: array(
)
loop: array(
)
stmts: array(
)
comments: array(
0: // alternative syntax
)
)
)

View file

@ -0,0 +1,164 @@
Foreach loop
-----
<?php
// foreach on variable
foreach ($a as $b) {}
foreach ($a as &$b) {}
foreach ($a as $b => $c) {}
foreach ($a as $b => &$c) {}
foreach ($a as list($a, $b)) {}
foreach ($a as $a => list($b, , $c)) {}
// foreach on expression
foreach (array() as $b) {}
// alternative syntax
foreach ($a as $b):
endforeach;
-----
array(
0: Stmt_Foreach(
expr: Expr_Variable(
name: a
)
keyVar: null
byRef: false
valueVar: Expr_Variable(
name: b
)
stmts: array(
)
comments: array(
0: // foreach on variable
)
)
1: Stmt_Foreach(
expr: Expr_Variable(
name: a
)
keyVar: null
byRef: true
valueVar: Expr_Variable(
name: b
)
stmts: array(
)
)
2: Stmt_Foreach(
expr: Expr_Variable(
name: a
)
keyVar: Expr_Variable(
name: b
)
byRef: false
valueVar: Expr_Variable(
name: c
)
stmts: array(
)
)
3: Stmt_Foreach(
expr: Expr_Variable(
name: a
)
keyVar: Expr_Variable(
name: b
)
byRef: true
valueVar: Expr_Variable(
name: c
)
stmts: array(
)
)
4: Stmt_Foreach(
expr: Expr_Variable(
name: a
)
keyVar: null
byRef: false
valueVar: Expr_List(
items: array(
0: Expr_ArrayItem(
key: null
value: Expr_Variable(
name: a
)
byRef: false
)
1: Expr_ArrayItem(
key: null
value: Expr_Variable(
name: b
)
byRef: false
)
)
)
stmts: array(
)
)
5: Stmt_Foreach(
expr: Expr_Variable(
name: a
)
keyVar: Expr_Variable(
name: a
)
byRef: false
valueVar: Expr_List(
items: array(
0: Expr_ArrayItem(
key: null
value: Expr_Variable(
name: b
)
byRef: false
)
1: null
2: Expr_ArrayItem(
key: null
value: Expr_Variable(
name: c
)
byRef: false
)
)
)
stmts: array(
)
)
6: Stmt_Foreach(
expr: Expr_Array(
items: array(
)
)
keyVar: null
byRef: false
valueVar: Expr_Variable(
name: b
)
stmts: array(
)
comments: array(
0: // foreach on expression
)
)
7: Stmt_Foreach(
expr: Expr_Variable(
name: a
)
keyVar: null
byRef: false
valueVar: Expr_Variable(
name: b
)
stmts: array(
)
comments: array(
0: // alternative syntax
)
)
)

View file

@ -0,0 +1,25 @@
While loop
-----
<?php
while ($a) {}
while ($a):
endwhile;
-----
array(
0: Stmt_While(
cond: Expr_Variable(
name: a
)
stmts: array(
)
)
1: Stmt_While(
cond: Expr_Variable(
name: a
)
stmts: array(
)
)
)

View file

@ -0,0 +1,65 @@
Try/catch with multiple classes
-----
<?php
try {
$x;
} catch (X|Y $e1) {
$y;
} catch (\A|B\C $e2) {
$z;
}
-----
!!php7
array(
0: Stmt_TryCatch(
stmts: array(
0: Expr_Variable(
name: x
)
)
catches: array(
0: Stmt_Catch(
types: array(
0: Name(
parts: array(
0: X
)
)
1: Name(
parts: array(
0: Y
)
)
)
var: e1
stmts: array(
0: Expr_Variable(
name: y
)
)
)
1: Stmt_Catch(
types: array(
0: Name_FullyQualified(
parts: array(
0: A
)
)
1: Name(
parts: array(
0: B
1: C
)
)
)
var: e2
stmts: array(
0: Expr_Variable(
name: z
)
)
)
)
finally: null
)
)

View file

@ -0,0 +1,168 @@
Aliases (use)
-----
<?php
use A\B;
use C\D as E;
use F\G as H, J;
// evil alias notation - Do Not Use!
use \A;
use \A as B;
// function and constant aliases
use function foo\bar;
use function foo\bar as baz;
use const foo\BAR;
use const foo\BAR as BAZ;
-----
array(
0: Stmt_Use(
type: TYPE_NORMAL (1)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: A
1: B
)
)
alias: B
)
)
)
1: Stmt_Use(
type: TYPE_NORMAL (1)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: C
1: D
)
)
alias: E
)
)
)
2: Stmt_Use(
type: TYPE_NORMAL (1)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: F
1: G
)
)
alias: H
)
1: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: J
)
)
alias: J
)
)
)
3: Stmt_Use(
type: TYPE_NORMAL (1)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: A
)
)
alias: A
)
)
comments: array(
0: // evil alias notation - Do Not Use!
)
)
4: Stmt_Use(
type: TYPE_NORMAL (1)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: A
)
)
alias: B
)
)
)
5: Stmt_Use(
type: TYPE_FUNCTION (2)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: foo
1: bar
)
)
alias: bar
)
)
comments: array(
0: // function and constant aliases
)
)
6: Stmt_Use(
type: TYPE_FUNCTION (2)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: foo
1: bar
)
)
alias: baz
)
)
)
7: Stmt_Use(
type: TYPE_CONSTANT (3)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: foo
1: BAR
)
)
alias: BAR
)
)
)
8: Stmt_Use(
type: TYPE_CONSTANT (3)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: foo
1: BAR
)
)
alias: BAZ
)
)
)
)

View file

@ -0,0 +1,42 @@
Braced namespaces
-----
<?php
namespace Foo\Bar {
foo;
}
namespace {
bar;
}
-----
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: Foo
1: Bar
)
)
stmts: array(
0: Expr_ConstFetch(
name: Name(
parts: array(
0: foo
)
)
)
)
)
1: Stmt_Namespace(
name: null
stmts: array(
0: Expr_ConstFetch(
name: Name(
parts: array(
0: bar
)
)
)
)
)
)

View file

@ -0,0 +1,22 @@
Trailing comment after braced namespace declaration
-----
<?php
namespace Foo {}
// Comment
-----
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: Foo
)
)
stmts: array(
)
)
1: Stmt_Nop(
comments: array(
0: // Comment
)
)
)

View file

@ -0,0 +1,188 @@
Group use declarations
-----
<?php
use A\{B};
use A\{B\C, D};
use \A\B\{C\D, E};
use function A\{b\c, d};
use const \A\{B\C, D};
use A\B\{C\D, function b\c, const D};
-----
array(
0: Stmt_GroupUse(
type: TYPE_UNKNOWN (0)
prefix: Name(
parts: array(
0: A
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: B
)
)
alias: B
)
)
)
1: Stmt_GroupUse(
type: TYPE_UNKNOWN (0)
prefix: Name(
parts: array(
0: A
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: B
1: C
)
)
alias: C
)
1: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: D
)
)
alias: D
)
)
)
2: Stmt_GroupUse(
type: TYPE_UNKNOWN (0)
prefix: Name(
parts: array(
0: A
1: B
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: C
1: D
)
)
alias: D
)
1: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: E
)
)
alias: E
)
)
)
3: Stmt_GroupUse(
type: TYPE_FUNCTION (2)
prefix: Name(
parts: array(
0: A
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: b
1: c
)
)
alias: c
)
1: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: d
)
)
alias: d
)
)
)
4: Stmt_GroupUse(
type: TYPE_CONSTANT (3)
prefix: Name(
parts: array(
0: A
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: B
1: C
)
)
alias: C
)
1: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: D
)
)
alias: D
)
)
)
5: Stmt_GroupUse(
type: TYPE_UNKNOWN (0)
prefix: Name(
parts: array(
0: A
1: B
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: C
1: D
)
)
alias: D
)
1: Stmt_UseUse(
type: TYPE_FUNCTION (2)
name: Name(
parts: array(
0: b
1: c
)
)
alias: c
)
2: Stmt_UseUse(
type: TYPE_CONSTANT (3)
name: Name(
parts: array(
0: D
)
)
alias: D
)
)
)
)

View file

@ -0,0 +1,107 @@
Invalid group use syntax
-----
<?php
// Missing semicolon
use Foo\{Bar}
use Bar\{Foo};
-----
!!php7
Syntax error, unexpected T_USE, expecting ';' from 4:1 to 4:3
array(
0: Stmt_GroupUse(
type: TYPE_UNKNOWN (0)
prefix: Name(
parts: array(
0: Foo
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: Bar
)
)
alias: Bar
)
)
comments: array(
0: // Missing semicolon
)
)
1: Stmt_GroupUse(
type: TYPE_UNKNOWN (0)
prefix: Name(
parts: array(
0: Bar
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: Foo
)
)
alias: Foo
)
)
)
)
-----
<?php
// Missing NS separator
use Foo {Bar, Baz};
-----
!!php7
Syntax error, unexpected '{', expecting ';' from 3:9 to 3:9
array(
0: Stmt_Use(
type: TYPE_NORMAL (1)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: Foo
)
)
alias: Foo
)
)
comments: array(
0: // Missing NS separator
)
)
1: Expr_ConstFetch(
name: Name(
parts: array(
0: Bar
)
)
)
2: Expr_ConstFetch(
name: Name(
parts: array(
0: Baz
)
)
)
)
-----
<?php
// Extra NS separator
use Foo\{\Bar};
-----
Syntax error, unexpected T_NS_SEPARATOR, expecting T_STRING or T_FUNCTION or T_CONST from 3:10 to 3:10
array(
0: Expr_ConstFetch(
name: Name_FullyQualified(
parts: array(
0: Bar
)
)
)
)

View file

@ -0,0 +1,28 @@
Ensure correct file position attributes for group use prefix
-----
<?php
use Foo\Bar\{Baz};
-----
!!positions
array(
0: Stmt_GroupUse[2:1 - 2:17](
type: TYPE_UNKNOWN (0)
prefix: Name[2:5 - 2:11](
parts: array(
0: Foo
1: Bar
)
)
uses: array(
0: Stmt_UseUse[2:14 - 2:16](
type: TYPE_NORMAL (1)
name: Name[2:14 - 2:16](
parts: array(
0: Baz
)
)
alias: Baz
)
)
)
)

View file

@ -0,0 +1,47 @@
Group use can have trailing comma
-----
<?php
use A\{B,};
use function A\{b,};
-----
!!php7
array(
0: Stmt_GroupUse(
type: TYPE_UNKNOWN (0)
prefix: Name(
parts: array(
0: A
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_NORMAL (1)
name: Name(
parts: array(
0: B
)
)
alias: B
)
)
)
1: Stmt_GroupUse(
type: TYPE_FUNCTION (2)
prefix: Name(
parts: array(
0: A
)
)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: b
)
)
alias: b
)
)
)
)

View file

@ -0,0 +1,83 @@
Invalid namespace names
-----
<?php namespace self;
-----
Cannot use 'self' as namespace name from 1:17 to 1:20
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: self
)
)
stmts: array(
)
)
)
-----
<?php namespace PARENT;
-----
Cannot use 'PARENT' as namespace name from 1:17 to 1:22
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: PARENT
)
)
stmts: array(
)
)
)
-----
<?php namespace static;
-----
Syntax error, unexpected T_STATIC, expecting T_STRING or T_NS_SEPARATOR or '{' from 1:17 to 1:22
array(
)
-----
<?php use A as self;
-----
Cannot use A as self because 'self' is a special class name from 1:16 to 1:19
array(
0: Stmt_Use(
type: TYPE_NORMAL (1)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: A
)
)
alias: self
)
)
)
)
-----
<?php use B as PARENT;
-----
Cannot use B as PARENT because 'PARENT' is a special class name from 1:16 to 1:21
array(
0: Stmt_Use(
type: TYPE_NORMAL (1)
uses: array(
0: Stmt_UseUse(
type: TYPE_UNKNOWN (0)
name: Name(
parts: array(
0: B
)
)
alias: PARENT
)
)
)
)
-----
<?php use C as static;
-----
Syntax error, unexpected T_STATIC, expecting T_STRING from 1:16 to 1:21
array(
)

View file

@ -0,0 +1,103 @@
Namespace types cannot be mixed
-----
<?php
namespace A;
echo 1;
namespace B {
echo 2;
}
echo 3;
-----
Cannot mix bracketed namespace declarations with unbracketed namespace declarations on line 4
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: A
)
)
stmts: array(
0: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 1
)
)
)
)
)
1: Stmt_Namespace(
name: Name(
parts: array(
0: B
)
)
stmts: array(
0: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 2
)
)
)
)
)
2: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 3
)
)
)
)
-----
<?php
namespace A {
echo 1;
}
echo 2;
namespace B;
echo 3;
-----
Cannot mix bracketed namespace declarations with unbracketed namespace declarations on line 6
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: A
)
)
stmts: array(
0: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 1
)
)
)
)
)
1: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 2
)
)
)
2: Stmt_Namespace(
name: Name(
parts: array(
0: B
)
)
stmts: array(
0: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 3
)
)
)
)
)
)

View file

@ -0,0 +1,42 @@
Different name types
-----
<?php
A;
A\B;
\A\B;
namespace\A\B;
-----
array(
0: Expr_ConstFetch(
name: Name(
parts: array(
0: A
)
)
)
1: Expr_ConstFetch(
name: Name(
parts: array(
0: A
1: B
)
)
)
2: Expr_ConstFetch(
name: Name_FullyQualified(
parts: array(
0: A
1: B
)
)
)
3: Expr_ConstFetch(
name: Name_Relative(
parts: array(
0: A
1: B
)
)
)
)

View file

@ -0,0 +1,30 @@
Nested namespaces are not allowed
-----
<?php
namespace A {
namespace B {
}
}
-----
Namespace declarations cannot be nested from 3:5 to 5:5
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: A
)
)
stmts: array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: B
)
)
stmts: array(
)
)
)
)
)

View file

@ -0,0 +1,45 @@
Semicolon style namespaces
-----
<?php
namespace Foo\Bar;
foo;
namespace Bar;
bar;
-----
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: Foo
1: Bar
)
)
stmts: array(
0: Expr_ConstFetch(
name: Name(
parts: array(
0: foo
)
)
)
)
)
1: Stmt_Namespace(
name: Name(
parts: array(
0: Bar
)
)
stmts: array(
0: Expr_ConstFetch(
name: Name(
parts: array(
0: bar
)
)
)
)
)
)

View file

@ -0,0 +1,22 @@
Hashbang followed by namespace declaration
-----
#!/usr/bin/env php
<?php
namespace A;
-----
array(
0: Stmt_InlineHTML(
value: #!/usr/bin/env php
)
1: Stmt_Namespace(
name: Name(
parts: array(
0: A
)
)
stmts: array(
)
)
)

View file

@ -0,0 +1,58 @@
Some statements may occur outside of namespaces
-----
<?php
declare(A='B');
namespace B {
}
__halt_compiler()
?>
Hi!
-----
array(
0: Stmt_Declare(
declares: array(
0: Stmt_DeclareDeclare(
key: A
value: Scalar_String(
value: B
)
)
)
stmts: null
)
1: Stmt_Namespace(
name: Name(
parts: array(
0: B
)
)
stmts: array(
)
)
2: Stmt_HaltCompiler(
remaining: Hi!
)
)
-----
<?php
/* Comment */
;
namespace Foo;
-----
array(
0: Stmt_Nop(
comments: array(
0: /* Comment */
)
)
1: Stmt_Namespace(
name: Name(
parts: array(
0: Foo
)
)
stmts: array(
)
)
)

View file

@ -0,0 +1,105 @@
There (mostly) can't be statements outside of namespaces
-----
<?php
echo 1;
echo 2;
namespace A;
-----
Namespace declaration statement has to be the very first statement in the script on line 4
array(
0: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 1
)
)
)
1: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 2
)
)
)
2: Stmt_Namespace(
name: Name(
parts: array(
0: A
)
)
stmts: array(
)
)
)
-----
<?php
namespace A {}
echo 1;
-----
No code may exist outside of namespace {} from 3:1 to 3:7
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: A
)
)
stmts: array(
)
)
1: Stmt_Echo(
exprs: array(
0: Scalar_LNumber(
value: 1
)
)
)
)
-----
<?php
namespace A {}
declare(ticks=1);
foo();
namespace B {}
-----
No code may exist outside of namespace {} from 3:1 to 3:17
array(
0: Stmt_Namespace(
name: Name(
parts: array(
0: A
)
)
stmts: array(
)
)
1: Stmt_Declare(
declares: array(
0: Stmt_DeclareDeclare(
key: ticks
value: Scalar_LNumber(
value: 1
)
)
)
stmts: null
)
2: Expr_FuncCall(
name: Name(
parts: array(
0: foo
)
)
args: array(
)
)
3: Stmt_Namespace(
name: Name(
parts: array(
0: B
)
)
stmts: array(
)
)
)

View file

@ -0,0 +1,73 @@
Switch
-----
<?php
switch ($a) {
case 0:
case 1;
default:
}
// alternative syntax
switch ($a):
endswitch;
// leading semicolon
switch ($a) { ; }
switch ($a): ; endswitch;
-----
array(
0: Stmt_Switch(
cond: Expr_Variable(
name: a
)
cases: array(
0: Stmt_Case(
cond: Scalar_LNumber(
value: 0
)
stmts: array(
)
)
1: Stmt_Case(
cond: Scalar_LNumber(
value: 1
)
stmts: array(
)
)
2: Stmt_Case(
cond: null
stmts: array(
)
)
)
)
1: Stmt_Switch(
cond: Expr_Variable(
name: a
)
cases: array(
)
comments: array(
0: // alternative syntax
)
)
2: Stmt_Switch(
cond: Expr_Variable(
name: a
)
cases: array(
)
comments: array(
0: // leading semicolon
)
)
3: Stmt_Switch(
cond: Expr_Variable(
name: a
)
cases: array(
)
)
)

View file

@ -0,0 +1,130 @@
Try/catch
-----
<?php
try {
doTry();
} catch (A $b) {
doCatchA();
} catch (B $c) {
doCatchB();
} finally {
doFinally();
}
// no finally
try { }
catch (A $b) { }
// no catch
try { }
finally { }
-----
array(
0: Stmt_TryCatch(
stmts: array(
0: Expr_FuncCall(
name: Name(
parts: array(
0: doTry
)
)
args: array(
)
)
)
catches: array(
0: Stmt_Catch(
types: array(
0: Name(
parts: array(
0: A
)
)
)
var: b
stmts: array(
0: Expr_FuncCall(
name: Name(
parts: array(
0: doCatchA
)
)
args: array(
)
)
)
)
1: Stmt_Catch(
types: array(
0: Name(
parts: array(
0: B
)
)
)
var: c
stmts: array(
0: Expr_FuncCall(
name: Name(
parts: array(
0: doCatchB
)
)
args: array(
)
)
)
)
)
finally: Stmt_Finally(
stmts: array(
0: Expr_FuncCall(
name: Name(
parts: array(
0: doFinally
)
)
args: array(
)
)
)
)
)
1: Stmt_TryCatch(
stmts: array(
)
catches: array(
0: Stmt_Catch(
types: array(
0: Name(
parts: array(
0: A
)
)
)
var: b
stmts: array(
)
)
)
finally: null
comments: array(
0: // no finally
)
)
2: Stmt_TryCatch(
stmts: array(
)
catches: array(
)
finally: Stmt_Finally(
stmts: array(
)
)
comments: array(
0: // no catch
)
)
)

View file

@ -0,0 +1,27 @@
Cannot use try without catch or finally
-----
<?php
try {
foo();
}
-----
Cannot use try without catch or finally from 3:1 to 5:1
array(
0: Stmt_TryCatch(
stmts: array(
0: Expr_FuncCall(
name: Name(
parts: array(
0: foo
)
)
args: array(
)
)
)
catches: array(
)
finally: null
)
)

View file

@ -0,0 +1,26 @@
Unset
-----
<?php
unset($a);
unset($b, $c);
-----
array(
0: Stmt_Unset(
vars: array(
0: Expr_Variable(
name: a
)
)
)
1: Stmt_Unset(
vars: array(
0: Expr_Variable(
name: b
)
1: Expr_Variable(
name: c
)
)
)
)