/**
* 根据单独定义的类文件获取相关类信息
* @param string $path_file 文件绝对路径
* @return array
*/
function getClassFromFile(string $path_file): array
{
if (!file_exists($path_file)) return [];
// 获取文件内容
$contents = file_get_contents($path_file);
$namespace = $classname = $extends = "";
$implements = [];
$is_namespace = $is_classname = $is_extends = $is_implements = false;
foreach (token_get_all($contents) as $token)
{
if (is_array($token))
{
if ($token[0] == T_NAMESPACE) $is_namespace = true;
if ($token[0] == T_CLASS) $is_classname = true;
if ($token[0] == T_EXTENDS) $is_extends = true;
if ($token[0] == T_IMPLEMENTS) $is_implements = true;
}
if ($is_namespace === true)
{
// 如果$token[0]是字符串或分隔符
if (is_array($token) && in_array($token[0], [T_STRING, T_NS_SEPARATOR]))
$namespace .= $token[1];
else if ($token === ';') // 如果是分号则结束
$is_namespace = false;
}
if ($is_classname === true)
{
// 如果$token[0]是字符串
if (is_array($token) && $token[0] == T_STRING)
{
$classname = $token[1];
$is_classname = false;
}
}
if ($is_extends === true)
{
if (is_array($token) && $token[0] == T_STRING)
{
$extends = $token[1];
$is_extends = false;
}
}
if ($is_implements === true)
{
if (is_array($token) && $token[0] == T_STRING)
$implements[] = $token[1];
else if ($token === '{')
break; // 结束
}
}
return [
'class' => ($namespace ? ($namespace . '\\' . $classname) : $classname),
'namespace' => $namespace,
'classname' => $classname,
'extends' => $extends,
'implements' => $implements
];
}
各位道友,还有没有更好的方法呢? 我想获得继承某个接口的所有类!