确定在 PHP 类文件中定义了哪些类
假设我们项目中的每个PHP文件都包含一个类定义,我如何确定文件中定义了哪些类?
我知道我可以只对语句的文件进行正则表达式,但我更喜欢做一些更有效的事情。class
假设我们项目中的每个PHP文件都包含一个类定义,我如何确定文件中定义了哪些类?
我知道我可以只对语句的文件进行正则表达式,但我更喜欢做一些更有效的事情。class
对于我正在从事的项目,我需要这样的东西,以下是我编写的函数:
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
:“类”关键字;T_WHITESPACE
:“类”之后的空格;T_STRING
:类的名称。因此,此代码将处理您获得的任何奇怪的间距或换行符,因为它使用PHP用于执行文件的相同解析器。如果不能解析它,PHP也不能。token_get_all()
顺便说一句,您可以使用token_name()
将令牌号转换为其常量名称。
这是我的c2.php:
<?php
class MyClass {
public __construct() {
}
}
class MyOtherClass {
public __construct() {
}
}
?>
输出:
Found class: MyClass
Found class: MyOtherClass