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(
            type: 0
            name: null
            extends: null
            implements: array(
            )
            stmts: array(
                0: Stmt_ClassMethod(
                    type: 1
                    byRef: false
                    name: test
                    params: array(
                    )
                    returnType: null
                    stmts: array(
                    )
                )
            )
        )
        args: array(
        )
    )
    1: Expr_New(
        class: Stmt_Class(
            type: 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(
            type: 0
            name: null
            extends: null
            implements: array(
            )
            stmts: array(
                0: Stmt_Property(
                    type: 1
                    props: array(
                        0: Stmt_PropertyProperty(
                            name: foo
                            default: null
                        )
                    )
                )
            )
        )
        args: array(
        )
    )
    3: Expr_New(
        class: Stmt_Class(
            type: 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(
        type: 0
        name: A
        extends: null
        implements: array(
        )
        stmts: array(
            0: Stmt_ClassMethod(
                type: 1
                byRef: false
                name: test
                params: array(
                )
                returnType: null
                stmts: array(
                    0: Stmt_Return(
                        expr: Expr_New(
                            class: Stmt_Class(
                                type: 0
                                name: null
                                extends: Name(
                                    parts: array(
                                        0: A
                                    )
                                )
                                implements: array(
                                )
                                stmts: array(
                                    0: Stmt_ClassConst(
                                        consts: array(
                                            0: Const(
                                                name: A
                                                value: Scalar_String(
                                                    value: B
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                            args: array(
                                0: Arg(
                                    value: Expr_Variable(
                                        name: this
                                    )
                                    byRef: false
                                    unpack: false
                                )
                            )
                        )
                    )
                )
            )
        )
    )
)
