上次我检查(2008)php中的注释并没有那么广泛。现在阅读了一些材料并做了一些“谷歌搜索”后,我仍然有点困惑。有人可以提供一个最小的工作示例来说明如何在php中使用注释:
让我们说我想要这样的东西工作:
class ClassName
{
/**
* @DefaultValue("test")
*/
public $prop;
}
// so that i can do
$kls = new ClassName();
$kls->prop // => test
我很久没有做过php了
答案 0 :(得分:4)
PHP尚未支持注释。有一个RFC for a proposed implementation,但是不知道是否或何时会发生这种情况。
您给出的特定示例可能会被IDE解释为自动完成的值,否则您只能执行public $prop = 'Test';
,但我想您已经知道这并不是您的真实意图。
答案 1 :(得分:2)
PHP不应该支持注释,它们目前是PHP开发人员中的祸害。它们会导致许多问题:
他们打破版本控制。如果你想在不同的项目中有两个不同配置的对象实例,它们会变成不同的分支,即使它是改变的配置而不是逻辑。
它们降低了可移植性。如果在两个使用注释的项目之间移动一个类,注释可能会破坏第二个项目
他们破坏了封装。应用程序代码不应该关注如何在外部使用它。注释告诉客户端代码它应该做什么而不是让客户端代码决定。在你的@DefaultValue示例中,如果你在没有注意注释的地方使用该类,该怎么办?如果没有设置默认值,该类是否仍然可以工作?是?没有?也许?无论答案是什么,在API中都不清楚,并且无法知道对象一旦构建好是否已准备好履行其职责。
他们限制了灵活性。以Symfony的@Inject为例,使用不同的注入参数创建两个类的实例是不可能的。
请参阅:Annotations are an abomination和PHP Annotations Are a Horrible Idea以获取有关应避免这些原因的更详细说明。
答案 2 :(得分:2)
在PHP Manual -> Function Reference Variable and Type Related Extensions -> Reflection中,在几个反射类(ReflectionClass,ReflectionMethod,ReflectionFunction,ReflectionFunctionAbstract,ReflectionProperty ...)中存在一个方法getDocComment(),您可以在其中获取doc注释块。然后按照您想要的方式处理您的评论。例如:
class Foo {
private $a;
private $b;
...
/**
* @annotation('baz')
*/
public function bar() {
...
}
}
$reflMethod = new ReflectionMethod('Foo', 'bar');
//prints
//string(26) "/**
// * @annotation('baz')
// */"
var_dump($reflMethod->getDocComment());
答案 3 :(得分:0)
PHP不支持注释(还)。
我在PHP中使用注释影响代码流的唯一地方是phpUnit,它支持许多注释标记(例如@DataProvider
和@ExpectedException
)来处理测试脚本的各个方面
效果相当好,但本身并不由PHP处理;在包含脚本并正常运行代码之前,phpUnit必须解析脚本本身。对于单元测试脚本来说足够公平,但不是生产系统的理想解决方案。
所以我认为真正的答案是你必须等到PHP本地实现注释。我相信有一个提议,但它肯定不会很快发生 - 它肯定不会在5.5,将于明年发布。我不认为5.6或更高版本的功能有任何固定的计划,但如果我们至少延伸到2014年,即使假设您的托管服务提供商或服务器管理员愿意立即升级。