Get class name from file

后端 未结 10 1858
轮回少年
轮回少年 2020-12-08 10:29

I have a php file which contains only one class. how can I know what class is there by knowing the filename? I know I can do something with regexp matching but is there a st

10条回答
  •  孤城傲影
    2020-12-08 11:16

    I modified Nette\Reflection\AnnotationsParser that so it returns an array of namespace+classname that are defined in the file

    $parser = new PhpParser();
    $parser->extractPhpClasses('src/Path/To/File.php');
    
    
    class PhpParser
    {
        public function extractPhpClasses(string $path)
        {
            $code = file_get_contents($path);
            $tokens = @token_get_all($code);
            $namespace = $class = $classLevel = $level = NULL;
            $classes = [];
            while (list(, $token) = each($tokens)) {
                switch (is_array($token) ? $token[0] : $token) {
                    case T_NAMESPACE:
                        $namespace = ltrim($this->fetch($tokens, [T_STRING, T_NS_SEPARATOR]) . '\\', '\\');
                        break;
                    case T_CLASS:
                    case T_INTERFACE:
                        if ($name = $this->fetch($tokens, T_STRING)) {
                            $classes[] = $namespace . $name;
                        }
                        break;
                }
            }
            return $classes;
        }
    
        private function fetch(&$tokens, $take)
        {
            $res = NULL;
            while ($token = current($tokens)) {
                list($token, $s) = is_array($token) ? $token : [$token, $token];
                if (in_array($token, (array) $take, TRUE)) {
                    $res .= $s;
                } elseif (!in_array($token, [T_DOC_COMMENT, T_WHITESPACE, T_COMMENT], TRUE)) {
                    break;
                }
                next($tokens);
            }
            return $res;
        }
    }
    

提交回复
热议问题