2016-09-02 1 views
0

Ich möchte auf alle Klassen in einem bestimmten Ordner iterieren. Ist es möglich?php - iterate auf Klassen in einem Ordner definiert

Soweit ich verstehe, kann ich get_declared_classes nicht verwenden, da es nur Klassen berücksichtigt, die bereits verwendet wurden.

+1

Was möchten Sie mit den Klassen tun? Einfach iterieren? Und was? – AbraCadaver

+1

Verwenden Sie einen [PSR-4] (http://www.php-fig.org/psr/psr-4/) Autoloader. Wenn Sie Ihre Klassen entsprechend der Verzeichnisprüfung namespace zuweisen, ist es einfach, über sie mit z. B. zu iterieren. [Reflektion] (http://php.net/manual/en/reflectionclass.innamespace.php). –

+0

@PavelKoch Sie schlagen also vor, von den Basisverzeichnissen zu starten, die in 'composer.json' deklariert sind, und durchlaufen alle Unterordner und die darin enthaltenen Dateien und für jede Datei eine Klasse mit dem gleichen Namen? – marcosh

Antwort

1

Dies ist, wie Sie es tun können:

function getDirClasses($dir) 
{ 
    // store already declared classes: 
    $predeclaredClasses = get_declared_classes(); 

    // Load classes inside the given folder: 
    $i = new FileSystemIterator($dir, FileSystemIterator::SKIP_DOTS); 
    foreach ($i as $f) { 
     require_once $f->getPathname(); 
    } 

    // Enjoy 
    return array_diff(get_declared_classes(), $predeclaredClasses); 
} 

var_dump(getDirClasses(__DIR__ . '/src')); 

aus irgendeinem Grund, wenn Sie nicht wollen, um die Klassen zu laden, und Sie wollen einfach nur in den angegebenen Ordner-Klassen-Namen, dann mit dieser Funktion :

function getDirClassesUsingGrep($dir) 
{ 
    if (is_dir($dir)) { 
     $cmd = 'grep --no-filename -E "^\S*class +.+(*{)?$" ' . $dir . '/* | cut -d" " -f2'; 

     exec($cmd, $output); 

     return $output; 
    } 

    return false; 
} 


var_dump(getDirClassesUsingGrep(__DIR__ . '/src')); 
+0

interessante Lösung! Dies funktioniert gut als Skript; Was wäre, wenn ich das gleiche Ergebnis mit einem Methodenaufruf von einer Klasse erhalten möchte, wo ich nicht weiß, welche Klassen bereits benötigt wurden? – marcosh

+0

Ich habe meine Antwort aktualisiert, um Ihre Frage zu beantworten –