Похоже, патч был предложен. Но у меня нет никакой информации - https://groups.google.com/forum/#!topic/mongodb-user/KToczUct6BE
Я бы хотел, чтобы это работало также.
Мне нужно было что-то подобное для проекта, над которым я работаю, и вот функции, которые я написал:
function file_get_php_classes($filepath) {
$php_code = file_get_contents($filepath);
$classes = get_php_classes($php_code);
return $classes;
}
function get_php_classes($php_code) {
$classes = array();
$tokens = token_get_all($php_code);
$count = count($tokens);
for ($i = 2; $i < $count; $i++) {
if ( $tokens[$i - 2][0] == T_CLASS
&& $tokens[$i - 1][0] == T_WHITESPACE
&& $tokens[$i][0] == T_STRING) {
$class_name = $tokens[$i][1];
$classes[] = $class_name;
}
}
return $classes;
}
Если вы просто хотите проверить файл, не загружая его, используйте 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;
}
}
}
?>
По сути, это простой конечный автомат. В PHP последовательность токенов будет следующей:
T_CLASS
: ключевое слово «class»; T_WHITESPACE
: пробел (а) после «class»; T_STRING
: имя класса. Таким образом, этот код будет обрабатывать любые странные интервалы или символы новой строки, которые вы получаете просто отлично, потому что он использует тот же синтаксический анализатор, который PHP использует для выполнения файла. Если token_get_all ()
не может его проанализировать, то и PHP не сможет.
Кстати, вы используете token_name ()
, чтобы превратить номер токена в его постоянное имя.
] Вот мой c2.php:
<?php
class MyClass {
public __construct() {
}
}
class MyOtherClass {
public __construct() {
}
}
?>
Вывод:
Found class: MyClass
Found class: MyOtherClass
Используйте функцию PHP get_declared_classes () . Это возвращает массив классов, определенных в текущем скрипте.