php注释、名称空间和use关键字

php注释、名称空间和use关键字,php,symfony,namespaces,annotations,Php,Symfony,Namespaces,Annotations,我正在为php编写一个注释解析器(由于特殊需要,我不能使用任何第三方的注释解析器),我的灵感来自于Sympony2代码 namespace Acme\StoreBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="product") */ class Product { /** * @ORM\Column(type="integer") * @

我正在为php编写一个注释解析器(由于特殊需要,我不能使用任何第三方的注释解析器),我的灵感来自于Sympony2代码

namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="product")
 */
class Product
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
正如我在这里看到的,我们定义了ORM in use语句,然后注释解析器不知何故知道ORM是Doctrine\ORM\Mapping的别名

我的最终目标是能够将类名作为别名传递到注释中

use some/namespace/Enum;
use another/ns/PropEnum;

class Abc
{
   /**
    * @Enum(PropEnum)
    **/
   protected $prop;
}
你能告诉我正确的方向吗?我甚至不知道从哪里开始


谢谢

让我们看看
条令/注释
(Symfony使用的软件包)是如何解决这个问题的

解析类的PHP文件(您可以从中获得)。让我们逐行查看该方法:

if (method_exists($class, 'getUseStatements')) {
    return $class->getUseStatements();
}
Doctrine有一个自定义类,它已经有了一个
getUseStatements()
方法来获取类文件中的use语句。我想你不用那个类,所以让我们继续吧

if (false === $filename = $class->getFilename()) {
    return array();
}

$content = $this->getFileContent($filename, $class->getStartLine());

if (null === $content) {
    return array();
}
这些语句检索类的文件内容。如果没有内容或文件,也就没有use语句

$namespace = preg_quote($class->getNamespaceName());
$content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content);
在这里,他们正在寻找为文件中的类定义名称空间的行。它后面是use语句,因此正则表达式只提取名称空间及其后面的所有内容

$tokenizer = new TokenParser('<?php ' . $content);

$statements = $tokenizer->parseUseStatements($class->getNamespaceName());

return $statements;

$tokenizer=newtokenparser(让我们看看
条令/注释
(Symfony使用的包)是如何解决这个问题的

解析类的PHP文件(您可以通过该文件获得)。让我们逐行查看该方法:

if (method_exists($class, 'getUseStatements')) {
    return $class->getUseStatements();
}
Doctrine有一个自定义类,它已经有了一个
getUseStatements()
方法来获取类文件中的use语句。我假设您不使用该类,那么让我们继续吧

if (false === $filename = $class->getFilename()) {
    return array();
}

$content = $this->getFileContent($filename, $class->getStartLine());

if (null === $content) {
    return array();
}
这些语句检索类的文件内容。如果没有内容或文件,则也没有use语句

$namespace = preg_quote($class->getNamespaceName());
$content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content);
在这里,他们正在寻找为文件中的类定义名称空间的行,后面是use语句,因此正则表达式只提取名称空间及其后面的所有内容

$tokenizer = new TokenParser('<?php ' . $content);

$statements = $tokenizer->parseUseStatements($class->getNamespaceName());

return $statements;

$tokenizer=newtokenparser(让我们看看
条令/注释
(Symfony使用的包)是如何解决这个问题的

解析类的PHP文件(您可以通过该文件获得)。让我们逐行查看该方法:

if (method_exists($class, 'getUseStatements')) {
    return $class->getUseStatements();
}
Doctrine有一个自定义类,它已经有了一个
getUseStatements()
方法来获取类文件中的use语句。我假设您不使用该类,那么让我们继续吧

if (false === $filename = $class->getFilename()) {
    return array();
}

$content = $this->getFileContent($filename, $class->getStartLine());

if (null === $content) {
    return array();
}
这些语句检索类的文件内容。如果没有内容或文件,则也没有use语句

$namespace = preg_quote($class->getNamespaceName());
$content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content);
在这里,他们正在寻找为文件中的类定义名称空间的行,后面是use语句,因此正则表达式只提取名称空间及其后面的所有内容

$tokenizer = new TokenParser('<?php ' . $content);

$statements = $tokenizer->parseUseStatements($class->getNamespaceName());

return $statements;

$tokenizer=newtokenparser(让我们看看
条令/注释
(Symfony使用的包)是如何解决这个问题的

解析类的PHP文件(您可以通过该文件获得)。让我们逐行查看该方法:

if (method_exists($class, 'getUseStatements')) {
    return $class->getUseStatements();
}
Doctrine有一个自定义类,它已经有了一个
getUseStatements()
方法来获取类文件中的use语句。我假设您不使用该类,那么让我们继续吧

if (false === $filename = $class->getFilename()) {
    return array();
}

$content = $this->getFileContent($filename, $class->getStartLine());

if (null === $content) {
    return array();
}
这些语句检索类的文件内容。如果没有内容或文件,则也没有use语句

$namespace = preg_quote($class->getNamespaceName());
$content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content);
在这里,他们正在寻找为文件中的类定义名称空间的行,后面是use语句,因此正则表达式只提取名称空间及其后面的所有内容

$tokenizer = new TokenParser('<?php ' . $content);

$statements = $tokenizer->parseUseStatements($class->getNamespaceName());

return $statements;

$tokenizer=新的TokenParser('你可以看看Sf2使用的注释解析器库是如何工作的:我似乎找不到任何相关的名称空间。你可以看看Sf2使用的注释解析器库是如何工作的:我似乎找不到任何相关的名称空间。你可以看看Sf2使用的注释解析器库是如何工作的:我似乎没有为了能够找到任何与名称空间相关的内容,您可以看看Sf2使用的注释解析器库是如何工作的:我似乎找不到任何与名称空间相关的内容奇妙的想法!这绝对是一个值得深入研究的东西。感谢意见!这绝对是一个值得深入研究的东西。感谢意见!这绝对是一个值得深入研究的东西要深入研究。谢谢你的想法!这绝对是要深入研究的。谢谢