ClassDumper   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 6
Bugs 0 Features 0
Metric Value
wmc 12
c 6
b 0
f 0
lcom 1
cbo 2
dl 0
loc 102
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
C dumpClass() 0 39 8
B dump() 0 24 3
1
<?php
2
/**
3
 * Class Dumper
4
 *
5
 * @link      https://github.com/mtymek/class-dumper
6
 * @copyright Copyright (c) 2015 Mateusz Tymek
7
 * @license   BSD 2-Clause
8
 */
9
10
namespace ClassDumper;
11
12
use Zend\Code\Reflection\ClassReflection;
13
14
class ClassDumper
15
{
16
    /**
17
     * @var CodeGenerator
18
     */
19
    private $codeGenerator;
20
21
    /**
22
     * @var array
23
     */
24
    private $cache;
25
26
    /**
27
     * @var array
28
     */
29
    private $cachedClasses;
30
31
    /**
32
     * Class constructor
33
     */
34
    public function __construct()
35
    {
36
        $this->codeGenerator = new CodeGenerator();
37
    }
38
39
    /**
40
     * Returns class' code inside namespace
41
     *
42
     * @param ClassReflection $class
43
     */
44
    private function dumpClass(ClassReflection $class)
45
    {
46
        if (array_search($class->getName(), $this->cachedClasses) !== false) {
0 ignored issues
show
Bug introduced by
Consider using $class->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
47
            return;
48
        }
49
50
        if ($class->isInternal()) {
51
            return;
52
        }
53
54
        if ($class->getParentClass()) {
55
            $this->dumpClass($class->getParentClass());
56
        }
57
58
        foreach ($class->getInterfaces() as $interface) {
59
            $this->dumpClass($interface);
60
        }
61
62
        if ($class->getTraits()) {
63
            foreach ($class->getTraits() as $trait) {
64
                $this->dumpClass($trait);
65
            }
66
        }
67
68
        $classContents = $class->getContents(false);
69
        $classFileDir  = dirname($class->getFileName());
70
        $classContents = trim(str_replace('__DIR__', sprintf("'%s'", $classFileDir), $classContents));
71
72
        $uses = implode("\n", $this->codeGenerator->getUseLines($class));
73
74
        $this->cache[] = "namespace "
75
            . $class->getNamespaceName()
76
            . " {\n"
77
            . ($uses ? $uses . "\n" : '')
78
            . $this->codeGenerator->getDeclarationLine($class) . "\n"
79
            . $classContents
80
            . "\n}\n";
81
        $this->cachedClasses[] = $class->getName();
0 ignored issues
show
Bug introduced by
Consider using $class->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
82
    }
83
84
    /**
85
     * Generates merged code for specified classes
86
     *
87
     * @param array $classes
88
     * @param bool $minify
89
     * @return string
90
     */
91
    public function dump(array $classes, $minify = false)
92
    {
93
        $this->cache = [];
94
        $this->cachedClasses = [];
95
96
        foreach ($classes as $className) {
97
            $class = new ClassReflection($className);
98
            $this->dumpClass($class);
99
        }
100
101
        $code = implode("\n", $this->cache);
102
103
        if (!$minify) {
104
            return $code;
105
        }
106
107
        $tempFile = tempnam(sys_get_temp_dir(), 'class-dumper');
108
        file_put_contents($tempFile, "<?php\n" . $code);
109
        $stripped = php_strip_whitespace($tempFile);
110
        unlink($tempFile);
111
112
        // strip "<?php
113
        return trim(substr($stripped, strlen("<?php\n") - 1));
114
    }
115
}
116