classnamescanner-001

Gesponsorde koppelingen

PHP script bestanden

  1. classnamescanner-001

« Lees de omschrijving en reacties

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
/**
 * Klassenaamscanner inclusief voorbeeld
 *
 * @author Richard van Velzen
 */

/**
 * Scanner voor klasse- en interfacenamen in een bestand
 *
 * @param string $inputFile Bestand waarin namen gevonden moeten worden
 * @return array Array van klasse- en interfacenamen
 * @author Richard van Velzen
 */

function classNameScanner($inputFile) {
    if(!is_readable($inputFile)) {
        throw new InvalidArgumentException('Inputbestand is niet leesbaar');
    }


    $foundNames = array();
    // haal alle tokens uit het bestand op
    $tokens = token_get_all(file_get_contents($inputFile));
        
    for($i = 0, $length = count($tokens); $i !== $length; ++$i) {
        if(is_array($tokens[$i]) && ($tokens[$i][0] === T_CLASS || $tokens[$i][0] === T_INTERFACE)) {
            // begin te zoeken naar een T_STRING, en skip whitespace en comments
            for($j = $i + 1; $j !== $length; ++$j) {
                if(is_array($tokens[$j])) {
                    if($tokens[$j][0] == T_STRING) {
                        // we hebben een naam gevonden, gooi maar in de array
                        $foundNames[] = $tokens[$j][1];
                        continue 2;
                    }
elseif($tokens[$j][0] == T_WHITESPACE || $tokens[$j][0] == T_COMMENT || $tokens[$j][0] == T_DOC_COMMENT) {
                        // whitespace en comments skippen we
                        continue;
                    }
                }

                
                // hier klopt iets niet, hier hadden we nooit moeten komen
                // gooi een exception aangezien de syntax niet klopt en dit
                // bestand dus nooit geinclude kan worden

                throw new RuntimeException('Syntaxfout: geen naam gevonden na "class" of "interface"');
            }
        }
    }

        
    return $foundNames;
}


// stel je eigen includepath hier in
set_include_path('framework' . PATH_SEPARATOR . get_include_path());

$classMap = array();

// we willen het hele includepath maar al te graag gebruiken :-)
foreach(explode(PATH_SEPARATOR, get_include_path()) as $includePath) {
    // OS specifieke directory separator gebruiken
    $includePath = str_replace('\/', DIRECTORY_SEPARATOR, $includePath);
    if(substr($includePath, - 1, 1) !== DIRECTORY_SEPARATOR) {
        $includePath .= DIRECTORY_SEPARATOR;
    }

    
    // haal alle PHP en INC files op
    $files = glob($includePath . '*.{php,inc}', GLOB_BRACE);
    
    foreach($files as $file) {
        $file = realpath($file);
        foreach(classNameScanner($file) as $className) {
            $className = strtolower($className);
            if(!isset($classMap[$className])) {
                // alleen de eerste nemen, de rest zou nooit geinclude worden
                $classMap[$className] = $file;
            }
        }
    }
}


print_r($classMap);
?>

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.