Wenn Sie eine Datei nur prüfen wollen, ohne sie zu laden, verwenden Sie token_get_all()
:
<?php
header('Content-Type: text/plain');
$php_file = file_get_contents('c2.php');
$tokens = token_get_all($php_file);
$class_token = false;
foreach ($tokens as $token) {
if (is_array($token)) {
if ($token[0] == T_CLASS) {
$class_token = true;
} else if ($class_token && $token[0] == T_STRING) {
echo "Found class: $token[1]\n";
$class_token = false;
}
}
}
?>
Im Grunde handelt es sich um einen einfachen endlichen Zustandsautomaten. In PHP wird die Folge von Token sein wird:
T_CLASS
: Schlüsselwort 'class';
T_WHITESPACE
: Leerzeichen nach "Klasse";
T_STRING
: Name der Klasse.
Dieser Code kommt also mit seltsamen Abständen oder Zeilenumbrüchen gut zurecht, da er denselben Parser verwendet, den PHP zur Ausführung der Datei einsetzt. Wenn token_get_all()
nicht parsen kann, kann PHP es auch nicht.
Übrigens, Sie verwenden token_name()
um eine Token-Nummer in ihren konstanten Namen umzuwandeln.
Hier ist meine c2.php:
<?php
class MyClass {
public __construct() {
}
}
class MyOtherClass {
public __construct() {
}
}
?>
出力します。
Found class: MyClass
Found class: MyOtherClass