Interface_   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
c 1
b 0
f 0
lcom 1
cbo 3
dl 0
loc 72
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A extend() 0 7 2
A addStmt() 0 21 3
A getNode() 0 6 1
1
<?php
2
3
namespace PhpParser\Builder;
4
5
use PhpParser;
6
use PhpParser\Node\Name;
7
use PhpParser\Node\Stmt;
8
9
class Interface_ extends Declaration
10
{
11
    protected $name;
12
    protected $extends = array();
13
    protected $constants = array();
14
    protected $methods = array();
15
16
    /**
17
     * Creates an interface builder.
18
     *
19
     * @param string $name Name of the interface
20
     */
21
    public function __construct($name) {
22
        $this->name = $name;
23
    }
24
25
    /**
26
     * Extends one or more interfaces.
27
     *
28
     * @param Name|string ...$interfaces Names of interfaces to extend
29
     *
30
     * @return $this The builder instance (for fluid interface)
31
     */
32
    public function extend() {
33
        foreach (func_get_args() as $interface) {
34
            $this->extends[] = $this->normalizeName($interface);
35
        }
36
37
        return $this;
38
    }
39
40
    /**
41
     * Adds a statement.
42
     *
43
     * @param Stmt|PhpParser\Builder $stmt The statement to add
44
     *
45
     * @return $this The builder instance (for fluid interface)
46
     */
47
    public function addStmt($stmt) {
48
        $stmt = $this->normalizeNode($stmt);
49
50
        $type = $stmt->getType();
51
        switch ($type) {
52
            case 'Stmt_ClassConst':
53
                $this->constants[] = $stmt;
54
                break;
55
56
            case 'Stmt_ClassMethod':
57
                // we erase all statements in the body of an interface method
58
                $stmt->stmts = null;
0 ignored issues
show
Bug introduced by
Accessing stmts on the interface PhpParser\Node suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
59
                $this->methods[] = $stmt;
60
                break;
61
62
            default:
63
                throw new \LogicException(sprintf('Unexpected node of type "%s"', $type));
64
        }
65
66
        return $this;
67
    }
68
69
    /**
70
     * Returns the built interface node.
71
     *
72
     * @return Stmt\Interface_ The built interface node
73
     */
74
    public function getNode() {
75
        return new Stmt\Interface_($this->name, array(
76
            'extends' => $this->extends,
77
            'stmts' => array_merge($this->constants, $this->methods),
78
        ), $this->attributes);
79
    }
80
}