Определение, какие классы определяются в файле класса PHP

Похоже, патч был предложен. Но у меня нет никакой информации - https://groups.google.com/forum/#!topic/mongodb-user/KToczUct6BE

Я бы хотел, чтобы это работало также.

38
задан random 17 March 2012 в 00:59
поделиться

3 ответа

Мне нужно было что-то подобное для проекта, над которым я работаю, и вот функции, которые я написал:

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;
}
62
ответ дан 27 November 2019 в 03:16
поделиться

Если вы просто хотите проверить файл, не загружая его, используйте 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
16
ответ дан 27 November 2019 в 03:16
поделиться

Используйте функцию PHP get_declared_classes () . Это возвращает массив классов, определенных в текущем скрипте.

2
ответ дан 27 November 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: